Memory Leak mit Intel Compiler, mit GCC aber nicht...



  • Winn schrieb:

    CStoll schrieb:

    Wie genau verwendest du denn diese Klasse?

    ich tippe spontan auf sowas:

    abstract* ptr = new derive;
    for(...)
      ptr->testleak();
    delete ptr;
    

    -> und da könnte es Probleme geben, weil der abstact-Dtor nicht virtuell ist (was da passiert, ist undefiniert - meistens beschränkt es sich daraf, daß der Basis-Dtor direkt verwendet wird (und der derive-Teil nicht aufgeräumt wird).

    Nein, so verwende ich sie nicht... eher etwa so...
    [snip]

    Das ist doch genau so - nur daß es etwas tiefer verborgen ist - du verwendest einen 'abstract*', um darüber 'derive'-Objekte zu löschen.
    (btw, Arrays von polymorphen Objekten könnten noch weitere Gefahren mit sich bringen - dadurch, daß abgeleitete Objekte normalerweise größer sind als ihre Basisklasse, stimmt die Pointer-Arithmetik nicht mehr.

    Könnte es sein, daß wenn ich die Löschung über die <abstract> Klasse vornehme, die Polymorphie nicht per Standard definiert ist... habe gerade gesehen, daß mein <derive> DTOR nicht aufgerufen wird...

    Das kann nicht nur sein, das ist so. Und um das zu lösen, muß der Destruktor der Basisklasse virtuell definiert werden.



  • CStoll schrieb:

    Könnte es sein, daß wenn ich die Löschung über die <abstract> Klasse vornehme, die Polymorphie nicht per Standard definiert ist... habe gerade gesehen, daß mein <derive> DTOR nicht aufgerufen wird...

    Das kann nicht nur sein, das ist so. Und um das zu lösen, muß der Destruktor der Basisklasse virtuell definiert werden.

    Klasse, Danke CStoll !! Das wars... welch ein "dämlicher" Fehler... gcc hatte mich wohl verstanden, gg



  • Normalerweise gibst für diese Fehler meistens Compilerwarnung o_O
    Hab zwar daran gedacht, aber dachte der Kompiler würde meckern xd



  • nt



  • Aprollo schrieb:

    Normalerweise gibst für diese Fehler meistens Compilerwarnung o_O
    Hab zwar daran gedacht, aber dachte der Kompiler würde meckern xd

    Nun, weder der Intel noch der GCC haben gemeckert... das liegt wohl daran, daß ich zwar in der Basisklasse ein "virtuell" vor dem Destruktor hatte, aber auch bei der abgeleiteten Basisklasse 😉 Nachdem ich die "virtuell" Deklarationen in den abgeleiteten Destrokturen entfernt hatte, verschwand mein Memory Leak... es war wohl einfach zuviel des Guten :S



  • CStoll schrieb:

    Und um das zu lösen, muß der Destruktor der Basisklasse virtuell definiert werden.

    Nun, weder der Intel noch der GCC haben gemeckert... das liegt wohl daran, daß ich zwar in der Basisklasse ein "virtuell" vor dem Destruktor hatte, aber auch bei der abgeleiteten Basisklasse 😉 Nachdem ich die "virtuell" Deklarationen in den abgeleiteten Destrokturen entfernt hatte, verschwand mein Memory Leak... es war wohl einfach zuviel des Guten :S

    Wenn in eine Klassen virtuelle Methoden deklariert sind aber keine virtuellen Destuktor, geben Mingw und VC++ Warnungen aus, weil man zwar die Methode richtig dispatchen kann, aber eine delete anweisung nicht.

    2 mal virtuelle sollte nicht der Fehler sein o_O



  • Winn schrieb:

    Aprollo schrieb:

    Normalerweise gibst für diese Fehler meistens Compilerwarnung o_O
    Hab zwar daran gedacht, aber dachte der Kompiler würde meckern xd

    Nun, weder der Intel noch der GCC haben gemeckert... das liegt wohl daran, daß ich zwar in der Basisklasse ein "virtuell" vor dem Destruktor hatte, aber auch bei der abgeleiteten Basisklasse 😉 Nachdem ich die "virtuell" Deklarationen in den abgeleiteten Destrokturen entfernt hatte, verschwand mein Memory Leak... es war wohl einfach zuviel des Guten :S

    In deinem oben gegebenen Beispiel war der Basis-Dtor nicht virtuell (und ob du den abgeleiteten Dtor virtual definierst, ist dann letztendlich egal)



  • CStoll schrieb:

    In deinem oben gegebenen Beispiel war der Basis-Dtor nicht virtuell (und ob du den abgeleiteten Dtor virtual definierst, ist dann letztendlich egal)

    Das stimmt, war auch nur ein Code-Snap... in meinem Produktions-Code war es doppelt "virtuell", es gab auch keine Warnings... ich kann Euch auch nur wiedergeben, was mir widerfahren ist. GCC compilierte den Code ja einwandfrei, während der Intel Compiler mit dem Doppelten-Lottchen spazieren fuhr...



  • intelc und vc machen bei virtuell manchmal durchaus seltsamme dinge.



  • rapsoo schrieb:

    intelc und vc machen bei virtuell manchmal durchaus seltsamme dinge.

    schmarren.



  • hustbaer schrieb:

    rapsoo schrieb:

    intelc und vc machen bei virtuell manchmal durchaus seltsamme dinge.

    schmarren.

    Ja, das ist dann das Resultat.


Anmelden zum Antworten