Anzeige:
Ergebnis 1 bis 2 von 2

Thema: Löschen bzw. wieder freigeben von speicher

  1. #1
    Registrierter Benutzer
    Registriert seit
    10.04.2008
    Beiträge
    10

    Löschen bzw. wieder freigeben von speicher

    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:
    Code:
    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

  2. #2
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Zitat Zitat von NoRulez Beitrag anzeigen
    Code:
    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.

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

    Zitat Zitat von NoRulez Beitrag anzeigen
    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.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •