Frage

Ich habe viele boost::shared_ptr<MyClass> Objekte, und irgendwann möchte ich absichtlich einige von ihnen delete etwas Speicher freizugeben. (Ich weiß, an diesem Punkt, dass ich nie die Spitz brauche Objekte MyClass mehr.) Wie kann ich das tun?

Ich denke, man kann nicht einfach delete() mit dem rohen Zeiger aufrufen, die ich mit get() bekommen.

Ich habe eine Funktion get_deleter(shared_ptr<T> const & p) in boost::shared_ptr gesehen, aber ich bin nicht sicher, wie es zu benutzen, und es sagt auch experimentelle direkt daneben. (Ich glaube, ich habe 1,38 steigern.)

Vielleicht weisen Sie einfach ein neues leeres boost::shared_ptr auf die Variable? Das sollte den alten Wert wegzuwerfen und löschen.

War es hilfreich?

Lösung

Sie nur tun

ptr.reset();

Sehen Sie die Shared_ptr Handbuch . Es ist äquivalent zu

shared_ptr<T>().swap(ptr)

Sie rufen reset auf jedem Smart-Pointer, die nicht mehr das Objekt verweisen. Die letzten solche reset (oder jede andere Aktion, die die Referenzzählung Abfall auf Null bewirkt, tatsächlich) bewirkt, dass das Objekt der deleter automatisch zu free'ed verwenden.

Vielleicht haben Sie Interesse in der Smart Pointer Programming Techniques rel="noreferrer"> . Es hat einen Eintrag über Deallokation verzögert.

Andere Tipps

Wenn Sie wollen in der Lage sein, Objekte zu absichtlich löschen (ich den ganzen Zeit), dann haben Sie einzelnes Eigentum zu verwenden. Sie haben in mit shared_ptr gelockt worden, wenn es nicht angebracht zu Ihrem Design ist.

Der ganze Sinn des boost::shared_ptr<T> ist, dass das Referenzobjekt wird gelöscht genau im Moment, wenn keine shared_ptr<T>s darauf verweisen - das heißt, wenn der letzte shared_ptr<T> an diesem Objekt zeigt den Gültigkeitsbereich verläßt oder wird neu zugewiesen zu einem anderen Objekt zu zeigen. Also, alles, was Sie tun müssen, um ein Objekt zu löschen ist sicherzustellen, dass es keine shared_ptr<T>s auf sie zeigen. Z.B. Wenn Sie nur eine einzige shared_ptr<T> p genannt haben auf ein Objekt zeigen, entweder lassen Sie es außerhalb des Bereichs fallen, oder rufen Sie p.reset() (äquivalent zu einem einfachen Zeiger auf p = NULL) oder weisen Sie auf etwas anderes zu zeigen.

Wenn Sie zwei shared_ptr<T>s haben auf das Objekt zeigt, werden Sie beide neu zuweisen müssen.

EDIT: Dank Dehmann für den Hinweis auf, dass p = NULL; nicht tatsächlich gültige Code für einen shared_ptr<T> ist ...:)

Was möchten Sie tun, ist das Rück mit schwachen Referenzen boost :: weak_ptr , die zu einem shared_ptr umgewandelt werden können, wenn nötig. Diese ermöglichen es Ihnen, die Lebensdauer des Objekts in der shared_ptr zu steuern und solche, die es kann auf die weak_ptr zugreifen möchten halten und versuchen, zu einem Shared_ptr zu konvertieren. Wenn das convert ausfällt, dann können sie das Objekt wieder in den Speicher erneut Abfrage und bringen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top