Objekt auf dem Heap im Vector loeschen
-
Hallo,
ich moechte in einem vector ein bestimmtes Element loeschen am Anfang des Programmes werden die Element so in den Vektor hingeschrieben:
vVector.push_back(new person(name,adress,village,zip));
Nun habe ich versucht einen bestimmten Datensatz so herauszuloeschen:
I = vVector.begin(); while(I != vVector.end()) { if((*I)->getName()==searchString) { cout << "Datensatz gefunden, wird nun geloescht!\n"; vFilme.erase(I); break; }else ++I; }
Leider bleibt der Datensatz hartnäckig im Vecktor :(:(
-
mehrere sachen:
1. ein erase killt nur den pointer, der speicherplatz ist damit nicht wieder freigegeben.
2. nach erase wird in 99% der fälle der iterator ungültig, dh eine schleife müsste mit einem neuen iterator weiterlaufen.
-
Kann man den Speicherplatz den so wieder freigeben ?
vFilme.erase(I); delete I;
Und das der Iterator ungültig wird ist doch eigentlich egal da die Schleife ja sowieso abgebrochen wird wenn der richtige Datensatz gelöscht worden ist. Aber mit der Veränderung oben klappt das löschen immer noch nicht. Der Datensatz ist immer noch vorhanden.
-
wenn der iterator ungültig ist, so hat er keinen sicheren wert, nicht einmal end.
und nein, du musst vorher das objekt killen, und erst dannd en zeiger, denn ein delete mit einem zeiger,welcher von einem ungültigen iterator zurückgeliefert wird ist nie gut.
-
Jetzt klappt das loeschen:
delete (*I); vFilme.erase(I);
Wobei mir das mit dem iterator immer noch nicht ganz klar wird der ganze Löschvorgang laeuft in einer Funktion ab wenn der richtige Datensatz gefunden ist wird er geloescht und die schleife wird auf der Stelle mit break verlassen. Wenn die Funktion zum loeschen erneut aufgerufen wird, wird der iterator natuerlich wieder auf begin() gesetzt;
-
naja oben hast du auch
delete I;
geschrieben, d.h. du löscht den iterator bzw. du versuchts es. du löschst aber damit nicht den wert auf das der it zeigt.
weiter unten hast du delete *I; gemacht, da löschst du den Wert.