In meinem C ++ - Programm erstelle ich Objekte in einer Funktion mit new. Diese Objekte werden in eine Menge eingefügt. Wenn ich Objekte aus dem Set entfernen möchte, verwende ich einen Iterator in einer For-Schleife. Wenn ich das Objekt aus der Menge entferne, muss ich das Objekt löschen, um den Speicher freizugeben, richtig? Ich habe versucht, mit delete, aber dann bekomme ich eine Fehlermeldung, dass der Zeiger freigegeben wurde nicht zugewiesen wurde. Wie kann das gemacht werden?
Hier ist der Code, wo ich das Objekt erstellen und es dann in die Menge einfügen
%Vor%In einer anderen Funktion versuche ich, ein Objekt aus der Menge zu entfernen und seinen Speicher freizugeben:
%Vor%Das funktioniert gut ohne den 'Löschen' Teil. Ich habe es hinzugefügt, weil ich dachte, dass die Erinnerung an das Objekt nicht freigegeben wird.
Angenommen, Sie rufen die erase()
-Methode des Sets auf, beachten Sie, dass dies den Destruktor des Objekts für Sie aufruft . Nachdem Sie erase()
auf Ihr Objekt gesetzt haben, war es bereits delete
d, und Ihr zweiter Versuch, den Löschvorgang manuell aufzurufen, wird fehlschlagen, da der Zeiger nicht mehr zugeordnet ist.
Als Referenz finden Sie dies
Ja, Sie müssen die von Ihnen erstellten Objekte löschen. Was in deinem Set ist, ist jedoch nicht unbedingt das, was du zugewiesen hast. Zum Beispiel enthält Ihr Set möglicherweise Objektwerte (anstelle von Zeigern) und Ihr zugewiesenes Objekt wird nach dem Einfügen geleakt. Postleitzahl.
Bearbeiten: Das war's. Ihr Set speichert keine Zeiger, es speichert Kopien der Objekte, die Sie zuweisen. Entfernen Sie das Löschen aus Ihrer Löschschleife und fügen Sie das Objekt wie folgt ein:
%Vor% Alternativ kannst du einfach set<myObject*>
setzen.
Auch das Löschen dauert einen Iterator - es muss nicht dereferenziert werden.
Tags und Links memory c++ pointers object delete-operator