Ich mache umfangreiche Verwendung von boost:shared_ptr
in meinem Code. Tatsächlich werden die meisten Objekte, die auf dem Heap reserviert sind, von einem shared_ptr
gehalten. Leider bedeutet das, dass ich this
nicht in eine beliebige Funktion überführen kann, die eine shared_ptr
übernimmt. Betrachten Sie diesen Code:Erhalten Sie einen boost :: shared_ptr für diese
void bar(boost::shared_ptr<Foo> pFoo)
{
...
}
void Foo::someFunction()
{
bar(this);
}
Es gibt zwei Probleme hier. Zuerst wird das nicht kompiliert, da der T * -Konstruktor für shared_ptr
explizit ist. Zweitens, wenn ich es erzwinge, mit bar(boost::shared_ptr<Foo>(this))
zu bauen, habe ich einen zweiten gemeinsamen Zeiger auf mein Objekt erstellt, der schließlich zu einem doppelten Löschen führen wird.
Das bringt mich zu meiner Frage: Gibt es ein Standardmuster zum Abrufen einer Kopie des vorhandenen freigegebenen Zeigers, von dem Sie wissen, dass er in einer Methode auf einem dieser Objekte existiert? Ist das Verwenden von intrusivem Referenzzählen meine einzige Option?
„_Ist mit aufdringlicher Referenz hier meine einzige Option Zählen _ "Was ist los mit dieser Option? – curiousguy
Vielleicht nichts. Hängt von Ihren Umständen ab. Es macht Ihre Objekte größer und funktioniert möglicherweise nicht an Orten, an denen Sie keine Kontrolle über die Klassen haben, an die Sie die Smartpointer halten. –
enabe_shared_from_this ist jetzt in 'std ::'. Schau dir meine Antwort an. –