PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dynamisch ertsellte Listen löschen



musketaquid
14-09-2007, 17:52
Muss ich die Listen mit delete wieder löschen, oder reicht es wenn ich den Vector lösche?

...
std::vector<std::list<std::string> > l;
...
for(int i = 0; i < t.size(); i++)
l.push_back(*(new list<string>));
...
// Die Listen werden bearbeitet
...
// Beim löschen des Objekts soll der Speicherplatz wieder freigegeben werden
//l.erase(l.begin(), l.end()); // Hier gibt es keine Fehler
for(int i = 0; i < t.size(); i++) // Aber dafür hier
delete &l[i];
...
Die letzte for Schleife mit delete, führt bei mir zu einem Speicherzugriffsfehler.
Meine Frage ist jetzt:
Wenn ich die letzte Schleife weglasse, und den Vector mit erase lösche, wird dann auch der mit new erzeugte Speicher wieder freigegeben?

BLUESCREEN3D
14-09-2007, 18:22
Beim push_back wird eh eine Kopie erstellt, also benutz da einfach kein new:

l.push_back(list<string>());

Mit dem new kannst du nämlich den reservierten Speicherplatz nie wieder freigeben, da du die zurückgegebene Adresse nirgends speicherst.
Und delete auf das Element aus dem vector anzuwenden geht nicht, weil im vector eben nicht das neu erstellte Element, sondern eine Kopie davon ist.

edit: Wenn du übrigens t.size() Listen in dem vector haben willst, geht das so einfacher:

std::vector<std::list<std::string> > l(t.size(), std::list<std::string>());
Und statt l.erase(l.begin(), l.end()) gibt es l.clear().

musketaquid
15-09-2007, 16:03
Danke für die Tips! Funktioniert prima :)