2010-12-20 9 views
16

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?

+1

Nicht wirklich ein Duplikat: http://stackoverflow.com/questions/4428023/enable-shared-from-this-c0x-what-am-i-doing-wrong –

Antwort

34

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.

5

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 ein weak_ptr Objekt Dies verweist auf das abgeleitete Objekt . Es gibt ein Huhn-und-Ei-Problem, obwohl, über , wie das weak_ptr Objekt zu initialisieren, wenn es kein entsprechendes shared_ptr Objekt gibt. Die Umsetzung Trick ist, dass die Konstrukteure für shared_ptr wissen über enable_shared_from_this, und stellen Sie die weak_ptr Objekt während des Baus von ein shared_ptr Objekt, das eine Ressource besitzt, die enable_shared_from_this als öffentliche Basisklasse hat.

1

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.

Verwandte Themen