Schwacher Zeiger darauf im Konstruktor

8

Ich verstehe, dass es nicht möglich ist, einen shared_ptr zu erhalten, indem shared_from_this () vom Konstruktor einer Klasse aufgerufen wird, da das Objekt noch nicht konstruiert ist. Ist es jedoch möglich, vom Konstruktor ein weak_ptr für das Objekt zu erhalten? Einige Boost-Forenbeiträge, die eine "weak_from_raw ()" -Methode diskutieren, legen nahe, dass dies möglich sein könnte.

Bearbeiten: Verbessern Sie das Formular, indem Sie weak_from_raw Ссылка

diskutieren     
tgoodhart 04.01.2011, 22:09
quelle

2 Antworten

15

Ich denke, worauf Sie verweisen ist dies . Das scheint nicht mit der Boost-Version verschmolzen zu sein (könnte falsch sein).

Von den Boost-Dokumenten :

Häufig gestellte Fragen

Q. Kann ein Objekt in seinem Konstruktor ein weak_ptr für sich selbst erzeugen?

A. Nein. Ein weak_ptr kann nur aus einem shared_ptr erstellt werden, und zum Zeitpunkt der Objektkonstruktion existiert noch kein shared_ptr für das Objekt. Selbst wenn Sie hierfür ein temporäres shared_ptr erstellen könnten, würde es am Ende des Konstruktors den Gültigkeitsbereich verlassen und alle Instanzen von weak_ptr würden sofort ablaufen.

Die Lösung besteht darin, den Konstruktor privat zu machen und eine Factory-Funktion bereitzustellen, die ein shared_ptr zurückgibt:

%Vor%     
James 04.01.2011, 22:16
quelle
5

Siehe: Ссылка

Das Problem besteht nicht darin, dass das Objekt nicht konstruiert ist. Das Problem besteht darin, dass shared_ptr nicht erstellt wurde. Wenn Sie nur ein shared_ptr erstellen und es irgendwo abschicken müssten, wäre alles in Ordnung. Wenn Sie versuchen, ein shared_ptr zu erstellen, das das gerade erstellte Objekt enthält. Es gibt keine Möglichkeit, die beiden zu verbinden, und Sie haben ein großes Problem.

Die Art und Weise, wie shared_from_this funktioniert, besteht darin, dass Sie davon ausgehen, dass Sie das Objekt als shared_ptr verwenden, bevor Sie shared_from_this aufrufen, um Zugriff darauf zu erhalten. Da der Konstruktor des Objekts noch nicht fertig ist und der shared_ptr damit nicht verbunden ist, können Sie shared_from_this nicht aufrufen.

Sie hätten genau das gleiche Problem mit dem weak_ptr.

Mit anderen Worten, dieses absurde Konstrukt würde funktionieren:

%Vor%

Aber du willst das wirklich nicht machen.

    
Crazy Eddie 04.01.2011 22:20
quelle