[gelöst] delete Zeiger auf Mutter-Klasse
-
Hallo,
ich baue gerade eine std::list mit verschiedenen Kindern auf. Folgendes:
class A { int zahl; }; class B : public A { int nochnezahl; }; class C : public A { int anderezahl; }; typedef std::list<A*> MyListe; A* a = new A(); a->zahl=1; B* b = new B(); b->zahl=2; b->nochnezahl=3; C* c = new C(); c->zahl=3; c->anderezahl=4; MyListe L; L.push_back(a); L.push_back(b); L.push_back(c); MyListe::iterator it; for (it=L.begin(); it!=L.end(); L++) { cout << *it->zahl; // Geht und findet die richtigen Zahlen. } for (it=L.begin()); it!=L.end(); L++) { delete *it; // Speicher-Leaks bei B* und C* } L.clear();Im groben mache ich genau das. Jetzt ist mir aufgefallen, dass ich Memory-Leaks bekomme. Und zwar bei, delete der Zeiger auf das B*- und C*-Element. Anscheinend kann man kein "delete A*" für ein Element von "B*" ausführen, weil dann nur die "A*"-Bereiche freigegeben werden. Der Rest bleibt wohl im Speicher liegen und ergibt das Leak.
Kann man das irgendwie trotzdem lösen?
Ich hab im Internet etwas gestöbert und etwas von auto_ptr gelesen, aber gleichzeitig viele Seiten gefunden, die davon abraten einen auto_prt in eine std::list zu legen. Außerdem finde ich gerade keinen Ansatz um den auto_prt irgendwie auf meine 3 Klassen passen zu schreiben.
auto_prt die Lösung oder ein falscher Ansatz?Frage: Wie kann ich in einem Listendurchlauf meine Pointer per delete löschen, ohne das etwas im Speicher zurück bleibt.
Danke,
StefanPS: Ich brauche die Strukturen, weil in der Klasse A eine virtuelle Funktion (für die Ausgabe) liegt, die in B und C virtuell überschrieben werden.
-
Ist der Destruktor von A virtuell?
-
Du brauchst einen virtuellen Destruktor in der Mutterklasse (
virtual ~A(){})!
-
Hallo und Danke,
da ich intern "nur" mit einfachen Variablen gearbeitet habe hatte ich gar keinen d'tor.
virtual ~A() {}war die Lösung.
-
rule of thumb:
Wenn die Klasse eine virtuelle Funktion hat dann sollte mit großer Wahrscheinlichkeit der Destruktor auch virtuell werden.Immer im Hinterkopf behalten

(Bedenke: wenn du eh schon eine virtuelle Funktion hast, kannst du ruhig immer den Dtor auch virtuell setzen - denn es kostet quasi garnichts).