So löschen Sie ein Objekt in einem Set

8

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.

    
node ninja 30.04.2011, 01:49
quelle

4 Antworten

7

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

    
Ben Stott 30.04.2011, 02:10
quelle
2

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.

    
sean e 30.04.2011 02:04
quelle
2

Dies ist, was Sie wollen, vorausgesetzt, dass Sie diese Objekte mit new neu zuweisen müssen:

%Vor%     
hifier 30.04.2011 03:04
quelle
1

Wenn Sie eine Zeigerliste benötigen, verwenden Sie eine Liste von intelligenten Zeigern. Verwenden Sie einen std-Algorithmus, um das richtige Element zu finden und es aus der Liste zu löschen.

%Vor%     
TimW 30.04.2011 07:29
quelle