So löschen Sie ein Objekt in einem Satz
In meinem C++ - Programm, erstelle ich Objekte in einer Funktion mit neuen. Diese Objekte sind eingefügt in eine Reihe. Wenn ich möchte, dass das entfernen von Objekten aus dem set, ich verwende einen iterator in einer for-Schleife. Wenn ich das Objekt entfernen aus dem set, die ich noch brauchen, um das Objekt zu löschen, um freien Speicher, richtig? Ich habe versucht mit löschen, aber dann bekomme ich eine Fehlermeldung, dass die Zeiger freigegeben wird nicht reserviert wurde. Also, wie kann dies gemacht werden?
Hier ist der code wo ich das Objekt erstellen und dann legen Sie es in den Satz
set <myObject> myobjectlist;
myObject *myobject = new myObject;
myobjectlist.insert(*myobject);
In einer anderen Funktion, ich versuche so entfernen Sie ein Objekt aus der Menge, und seine Speicher frei:
for (set<myObject>::iterator i = myobjectlist.begin(); i != myobjectlist.end(); i++)
if (i->myObjectID == myObjectID)
{
myobjectlist.erase(*i);
delete &i;
break;
}
Dieser funktioniert ohne die "löschen" - Teil. Ich habe es, weil ich dachte, dass der Speicher aus dem Objekt nicht freigegeben wird.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Angenommen, Sie sind Aufruf der eingestellten
erase()
Methode, beachten Sie, dass dies ruft den Destruktor des Objekts für Sie. Nachdem Sieerase()
Ihr Objekt, es wurde bereitsdelete
d und damit Ihren zweiten Versuch manuell aufrufen, löschen, wird scheitern, wie sich der Zeiger nicht mehr zugeordnet.Referenz, siehe diese
Ja, Sie brauchen, um Objekte zu löschen, die Sie erstellen. Jedoch, was ist in deinem Satz ist nicht unbedingt das, was Sie zugewiesen ist. Zum Beispiel, vielleicht Ihr set enthält Objekt-Werte (und nicht als Zeiger) und Ihrem zugeteilten Objekt ist durchgesickert, nach einfügen. Post code.
Bearbeiten:
Das war es dann. Ihr set nicht speichern Zeiger, es speichert Kopien der Objekte, die Sie zuordnen. Entfernen Sie die löschen-erase-Schleife und legen Sie das Objekt wie folgt:
Alternativ einfach machen Ihre gesetzt werden
set<myObject*>
.Auch löschen dauert ein iterator - keine Notwendigkeit, deref es.
erase()
d. Die erase-Mitglied ruft den Destruktor des Objekts und löschen versucht, das gleiche zu tun!Hier ist, was Sie wollen, vorausgesetzt, dass Sie brauchen, um mit new reservieren Sie diese Objekte:
Falls Sie eine Liste von Zeigern, die Verwendung einer Liste von smart-Pointer.
Verwenden Sie eine std algoritm finden Sie das richtige Element und löscht es aus der Liste.