Destruktor wird nicht aufgerufen, wenn Objekt über Zeiger von Typ der Mutterklasse gelöscht wird?



  • Hallo,
    Hab mich eben hier angemeldet, da mir eben zum ersten mal etwas sehr merkwürdiges aufgefallen ist:
    Ich speichere Zeiger auf Objekte in einer std::list, welche alle vom gleichen Typ abgeleitet sind (Kind : Mutter). Wenn ich nun alle Objekte in der list löschen möchte, gehe ich mit einem Iterator über meine Liste und rufe delete für das Objekt auf (delete *iter oder mutter = *iter; delete mutter). Allerdings wird dabei der Destruktor der Kind-Objekte nicht aufgerufen. Nur wenn ich mittels dynamic_cast den Zeiger Typ Mutter* in einen Kind* verwandle und anschließend delete kind aufrufe, wird der Destruktor aufgerufen.
    Bisher dachte ich immer, die Laufzeittypinformationen würden für solche Fälle ausreichen? Oder hab ich das schlicht und einfach schon immer übersehen und es hat so seine Ordnung?
    Grüße



  • Soweit ich weiß, muss der Destruktor einer Klasse von der geerbt wird, virtuell sein, damit der Destrujtor der abgeleiteten Klasse aufgerufen wird.

    Der gcc gibt soweit ich mich erinnere auch eine Warnung aus.



  • Ahja, das wars auch! danke!
    Wär angebracht, dass der VC-Kompiler da ne Warnung wirft 😉


  • Mod

    chris_phz schrieb:

    Ahja, das wars auch! danke!
    Wär angebracht, dass der VC-Kompiler da ne Warnung wirft 😉

    Tut er auch (C4265). aber die Leute sind zu faul, es einzuschalten.
    Edit: Allerdings warnt er nur, wenn der Destruktor explizit deklariert wird, nicht beim implizit deklarierten Destruktor.


Anmelden zum Antworten