PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Löschen bzw. wieder freigeben von speicher



NoRulez
10-04-2008, 18:20
hey @all,

ich habe mir ein NodeSystem gebaut, in dem ich bei jeder Node 1 Parent habe, jedoch jeder Node n childs haben kann.

Nun zu meinem Problem... Entweder ich stehe gerade gewaltig am Schlauch oder der Compiler hat ein Problem.

Ich lösche irgendeinen Node* mit "delete node".

Im Destructor der Node habe ich folgendes:


Node::~Node() {
for(std::vector<Node*>::iterator it = this->lchilds.begin(); it != this->lchilds.end(); ++it) {
if((*it) != NULL) {
delete &(*it);
(*it) = NULL;
it = this->lchilds.erase((*it));
}
}
}


Und genau hier hauts mich auf, da dieses "(*it) = NULL" nicht bewirkt das der Pointer auf NULL gesetzt wird und somit in this if anweisung geht und versucht das ganze nochmals zu löschen.

Habe ich da grundlegend was falsches gedacht? Achja, zukünftig hatte ich statt dem std::vector eine std::list. Jedoch liefert mir die std::list nur einen const_iterator zurück.

Kann mir bitte jemand bei diesem Problem helfen?

Vielen Dank im Voraus
LG NoRulez

P.S.: Blöde Frage, aber was muss ich in einem Destructor noch alles zerstören? Habe noch Elemente vom Typ time_t, std::string und int's

BLUESCREEN3D
10-04-2008, 19:23
Node::~Node() {
for(std::vector<Node*>::iterator it = this->lchilds.begin(); it != this->lchilds.end(); ++it) {
if((*it) != NULL) {
delete &(*it);
(*it) = NULL;
it = this->lchilds.erase((*it));
}
}
}

Hier sind gleich 2 Fehler:
Erstmal inkrementierst du den Iterator durch das ++it, dann aber auch nochmal durch "it = this->lchilds.erase((*it))" (welches aber eh nicht funktionieren dürfte, da erase() einen Iterator als Parameter erwartet). Somit überspringst du jeden zweiten Eintrag und damit mglw. auch das Ende. Aber das erase() brauchst du auch nicht, da der vector selbst automatisch gelöscht wird.
Auch das "delete &(*it)" dürfte nicht gehen, da *it ein Zeiger ist und &(*it) die Adresse des Zeigers. delete erwartet aber einen Zeiger. Also einfach das & weglassen.


Jedoch liefert mir die std::list nur einen const_iterator zurück.
Das muss an irgendwas anderem liegen. list hat auch normale Iteratoren.


P.S.: Blöde Frage, aber was muss ich in einem Destructor noch alles zerstören? Habe noch Elemente vom Typ time_t, std::string und int's
Immer nur das, was du mit new erstellt hast.