mich treibt gerade ein Destruktor um, der geordnet in einem Vector gespeicherten Zeiger auf Objekte löschen soll.
Selbstverständlich sollen die Objekte selber auch mit delete(...) sauber aus dem Speicher entfernt werden (und selbstverständlich vorher deren Destruktoren aufgerufen werden).
Mein Ansatz:
Code: Alles auswählen
class klasseA {
klasseA();
~klasseA();
std::vector<obj*> objVec;
};
Code: Alles auswählen
klasseA::klasseA {
objVec.push_back( new obj );
}
klasseA::~klasseA {
for( std::vector<obj*>::iterator it=objVec.begin(); it != objVec.end(); ++it ) {
delete( *it );
objVec.erase( it );
}
}
Ich habe nun mehrere Kombinationen aus delete und erase ausprobiert und konnte bisher noch nicht feststellen, dass es sauber funktioniert.
Nutze ich nur erase, dann wird zwar der Eintrag in dem Vector gelöscht - also: der Pointer entfernt - jedoch nicht das Objekt selbst aus dem Speicher.
Nutze ich nur delete, dann wird zwar das Objekt sauber über den Destruktor entfernt, jedoch bleibt der Eintrag in dem Vector erhalten (und wird ungültig: NULL).
Ich vermute das Problem in der for-Schleife, weil wir hier direkt auf die Größe der Liste einwirken, welche sich im Laufe der Loop ändert, womit evtl. die Schleife nicht fertig wird. Aber ich weiß es halt nicht, ob das stimmt und wie ich das ggfs. ändern könnte.
Wer weiß Rat?
Viele Grüße,
Lev