Wie machen Sie std::shared_ptr nicht, rufen Sie delete()
Habe ich-Funktionen, die in std::shared_ptr als argument, so dass ich gezwungen bin, benutze std::shared_ptr, aber die Objekt bin ich der übergabe an die Funktion ist nicht dynamisch zugeteilt. Wie kann ich wickeln Sie das Objekt std::shared_ptr und std::shared_ptr nicht, rufen Sie löschen auf Sie.
- mögliche Duplikate von Wie zu release-pointer von boost::shared_ptr?
- nicht ein Duplikat ist, diese Frage hat nichts zu tun mit der boost-library.
- Außer, dass
std::shared_ptr
undboost::shared_ptr
sind praktisch identisch. - boost::shared_ptr war im Grunde der Prototyp für das, was wurde std::shared_ptr.
- Dies ist eine schreckliche Idee. Der einzige Grund für eine Funktion zu akzeptieren
shared_ptr
ist, wenn er beabsichtigt, zum speichern eines Verweises auf die pointee (d.h., Aktienbesitz). Ungültig, das Objekt, während die Referenz wird irgendwo gespeichert wird nicht gut gehen. Wenn die Funktion in Frage stellt nicht speichern Sie einen Verweis, sollte es nicht akzeptieren, eine besitzende Zeiger-Typ. - Ein Anwendungsfall für diese ist, wo Sie so etwas wie
FILE *
wo der Typ kann entweder verwaltet werden (z.B. überfopen
) oder nicht (z.B.stdin
) und Sie haben eine Klasse verwendet, die das Objekt über den Ruf, den Sie erstellt wurden (z.B. die Erstellung einer parser-oder logger). In diesem Fall würden Sie wollen, eine "nichts tun" deleter mit stdin, sondern einefclose
deleter mit einemfopen
ed-Datei. - Eine real life-Anwendung, die ich habe über kommen, wo diese Idee Sinn macht, mit einem
shared_ptr<ostream>
. Vielleicht habe ich eine Funktion, die einen ostream und speichert einen Verweis, um es als einen freigegebenen Zeiger für die spätere Verwendung. Jetzt sagen wir, ich will die Ausgabe aufstd::cout
. Ich kann nicht löschenstd::cout
, aber ich kann garantieren, dass es existiert mindestens so lange wie meine Funktion speichert die shared pointer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Geben Sie eine no-op-deleter beim erstellen der shared pointer. E. g. wie diese:
Der beste Weg, dies zu tun, ist die Verwendung der aliasing-Konstruktor:
Im Vergleich zu den null-deleter Ansatz, diese müssen nicht reserviert einen control block, und ist
noexcept
.Wie bereits von @Casey und @Nevin, dies sollte nur durchgeführt werden, wenn Sie sicher sind, dass die Funktion nicht versucht in gemeinsamem Besitz sind, oder wenn das Objekt überlebt alles, könnte "eigenen" haben.
nasty_function(boost::shared_ptr<MyType> (boost::shared_ptr<MyType>(), &t));
std::weak_ptr
auf die daraus resultierendenstd::shared_ptr
.shared_ptr
ohne control block?Können Sie diesen trick:
ich war gerade auf der Suche nach einer Lösung, sah diese Frage. fand nichts und machte ein großer, das ist mein code
diese Lösung ist eine Kombination von lambda-Ausdrücken und Vererbung.
sehr gut gebildet. schnell. Sie können nicht erwarten, etwas mehr. nicht nur Sie können die deleter, aber wenn Sie einige änderungen, können Sie eine
std::function<void(pointer)>
als custom deleter. mit lambdas können Sie frei laufen und tun, was immer Sie wollen.