Iteratoren + delete
-
Darf man Iteratoren mit delete löschen? Die Suchfunktion hat nichts hilfreiches gebracht, ein Blick in den Index von TC++PL hat mir auch nicht weitergeholfen und mit google geht auch nichts.
-
Warum? Container bieten dafür doch i.d.R. erase() o.ä. an.
-
wie meinst du das? iteratoren ansichd arf man löschen
-
Du kannst die Objekte löschen auf die ein Iterator zeigt. Aber den Iterator selbst zu löschen (mit delete) macht keinen Sinn, da man sie ja normaleweise auf dem Stack anlegt!
-
@ KPC ich meinte
std::list<int>::iterator itr = --List.end();
delte itr;Also geht das
-
Glamdrink schrieb:
@ KPC ich meinte
std::list<int>::iterator itr = --List.end();
delte itr;Also geht das
Nein, geht es nicht. Erstens weil ein iterator keine implizite Konvertierung zu einem Zeiger bittet und zweitens weil nicht umsonst der jeweilige Container eine erase-Methode hat. Auch wenn das gehen sollte, UB ist vorprogrammiert. Den Inhalt eines iterators kannst du löschen, bis du blau wirst...
-
wird ein der Speicher eines mit new erzeugten Elementes der Liste mit erase wieder freigegeben?
-
Nein, der Speicher wird nicht freigegeben. Das müsste man schon selbst tun, oder man nimmt einen Smart Pointer, z.B. boost::shared_ptr.
-
deshalb wollte ich delete itr schreiben, wie kann ich den Speicher sonst freigeben?
-
Ich könnte delete (&(*itr)); schreiben, dass sollte man doch dürfen, oder ?
-
Du hast ja eine Liste von Zeigern, da reicht auch delete *it. Mit &*it bekommst du die Adresse des Pointers, was anscheinend nicht deine Absicht ist.
-
delete auf einen Iterator anzuwenden, ist imo nicht brauchbar. Erstmal hast du keine Sicherheit, dass it ein Objekt ist, welches mit new erzeugt wurde. Und zweitens, sollte es dir tatsächlich gelingen, musst du damit rechnen, dass du klasseninterne Verwaltungsmechanismen brichst.
-
@Shlo && groovemaster: Stimmt, ich hab den iterator gelöscht, statt dem, worauf er zeigt (was ja gelöscht werden soll), naja jetzt gehts auf jeden Fall.