Ich verwende enable_shared_from_this<Base>
und erben dann von Base
. Wenn ich versuche, shared_from_this()
in Derived
's Konstruktor (nicht Initialisierungsliste) zu verwenden, erhalte ich eine Ausnahme. Es stellt sich heraus, dass der interne schwache Zeiger Null ist und nicht auf this
überhaupt zeigt. Wie kann das passieren? Mein anderer Anwendungsfall von genau diesem funktioniert vollkommen in Ordnung. Ich weiß nicht einmal, wo ich anfangen soll. Ich schaute auf den Quellcode von enable_shared_from_this
, und es sieht für mich so aus, dass der Zeiger immer nullptr wäre.enable_shared_from_this - leeren internen schwachen Zeiger?
Antwort
Sie können shared_from_this()
im Konstruktor des Objekts nicht aufrufen. shared_from_this()
erfordert, dass das Objekt im Besitz mindestens einer shared_ptr
ist. Ein Objekt kann nicht von einem shared_ptr
besessen werden, bevor es erstellt wird.
Ich würde vermuten, dass der interne schwache Zeiger gesetzt ist, wenn ein shared_ptr
das Eigentum an dem Objekt zum ersten Mal übernimmt. Vor diesem Punkt gibt es keine Referenzzählungsstruktur, auf die der schwache Zeiger verweisen kann.
James McNellis's answer ist richtig.
Was die Erklärung der enable_shared_from_this
Vorlage selbst, die, wie Sie erscheint beobachten nichts, Anmerkung 7 am unteren Rand des this page zu tun, erklärt:
... die Vorlage
enable_shared_from_this
hält einweak_ptr
Objekt Dies verweist auf das abgeleitete Objekt . Es gibt ein Huhn-und-Ei-Problem, obwohl, über , wie dasweak_ptr
Objekt zu initialisieren, wenn es kein entsprechendesshared_ptr
Objekt gibt. Die Umsetzung Trick ist, dass die Konstrukteure fürshared_ptr
wissen überenable_shared_from_this
, und stellen Sie dieweak_ptr
Objekt während des Baus von einshared_ptr
Objekt, das eine Ressource besitzt, dieenable_shared_from_this
als öffentliche Basisklasse hat.
Konzeptionell shared_from_this()
nimmt ein shared_ptr
zeigt auf this
und gibt eine Kopie davon.
Im Konstruktor gibt es keine shared_ptr
, die auf this
zeigt.
Nicht wirklich ein Duplikat: http://stackoverflow.com/questions/4428023/enable-shared-from-this-c0x-what-am-i-doing-wrong –