Codeguard: Memory leak



  • Hi leute 🙂

    Codeguard zeigt beim ShutDown meines Programms an, dass mehrere Memory Leaks enstanden sind. Codeguard verweist auf das "new" des entsprechenden Objekts.

    Ich erzeuge Objekt einer Klasse A, die von Klasse B abgeleitet wird.

    Dieses Objekt wird in eine Message gehängt, die Datenobjekte der Klasse B enthalten kann. Nachdem die Message übertragen wurde löscht sie eigenständig ihren Inhalt.

    Ist es möglich dass Borland deswegen ein MemoryLeak vermutet, weil meine Objekte in die Basisklasse gecastet wurden und er dann praktisch bei der Suche nach dem "Delete" dieses Objekts nur eine delete der Basisklasse findet und keines der eigentlichen Klasse?

    PS: ich habe getestet ob das "delete" im destruktor der Message erreicht wird, und das ist tatsächlich der Fall (weiß aber nicht ob es immer erreicht wird, aber ich sehe keinen Grund warum das nicht der Fall sein sollte... )

    gruß Tobi



  • It0101 schrieb:

    Ist es möglich dass Borland deswegen ein MemoryLeak vermutet, weil meine Objekte in die Basisklasse gecastet wurden und er dann praktisch bei der Suche nach dem "Delete" dieses Objekts nur eine delete der Basisklasse findet und keines der eigentlich Klasse?

    Der Destruktor der Basisklasse ist hoffentlich "virtual" deklariert?



  • Ich seh grad dass der Destruktor in der Basisklasse auskommentiert war... könnte das das problem sein? 🙂

    Edit: Der Destruktor der Basisklasse tut eigentlich nichts...

    hier mal die Basisklasse:

    class BaseObject : public Object
    {
       public:
    
          __fastcall BaseObject();
          virtual __fastcall ~BaseObject();
    
      ...
    
    };
    

    Wenn ich den Destruktor nicht auskommentiere bekomme ich eine Fehlermeldung:

    [C++ Fehler] baseobject.h(16): E2113 Virtuelle Funktion '_fastcall BaseObject::~BaseObject()' verursacht Konflikte mit der Basisklasse 'Object'



  • Hallo

    Ob der Destruktor auskommentiert ist spielt keine Rolle, C++ erstellt dann automatisch einen leeren. Auch ob der Destruktor der Basisklasse etwas tut ist nicht wichtig.
    Wichtig ist vielmehr das angesprochene virtual, das unbedingt bei Destruktoren von Klassen stehen muß von denen abgeleitet werden soll. Denn sonst wird bei einem delete auf einen Basisklassenzeiger nicht der Destruktor der abgeleiteten Klasse aufgerufen! Und das führt dann spätestens dann zu Speicherlöchern wenn der Destruktor der abgeleiteten Klasse Aufräumarbeit zu erledigen hat.

    /Edit : Gut du hast nun den Code gepostet, damit wird meine bemerkung hinfälig.

    Ich bekomme da keinen Fehler

    class Test : public TObject
    {
      Test();
      virtual __fastcall ~Test();
    };
    

    bis bald
    akari



  • du leitest von TObject ab. Ich von Object (ist eine interne Klasse hier... )

    Da werd ich wohl mal in dieser Klasse nach der Ursache suchen.



  • Hallo

    Na dann schau dir doch mal den Destruktor von Object an. Ich vermute der hat kein __fastcall.

    bis bald
    akari



  • genau das wars 🙂

    Danke dir.

    Das eigentlich Problem mit den Memory Leaks hab ich auch gefunden. Am auskommentierten Destruktor lag es nicht.

    Kommt davon wenn man Klassen verwendet die man nicht selbst geschrieben hat 😉


Anmelden zum Antworten