Heim >Backend-Entwicklung >C++ >Warum kann „shared_from_this()' nicht direkt in Konstruktoren verwendet werden?
Verstehen der Einschränkungen von shared_from_this() in Konstruktoren
Das Konzept von shared_from_this() scheint praktisch zu sein, um gemeinsame Zeiger auf ein Objekt zu erstellen innerhalb seines Konstruktors. Es stellt jedoch eine technische Einschränkung dar, die eine direkte Verwendung verhindert. Um das Problem zu verstehen, untersuchen wir den zugrunde liegenden Mechanismus:
Das Rätsel: Selbstspeicherung von shared_ptr und Bauzeitpunkt
Laut Buchreferenz wird shared_ptr darin gespeichert ein privates Mitglied von enable_shared_from_this<> innerhalb der Basisklasse der Person. Die Verwirrung ergibt sich aus zwei wichtigen Punkten:
Warum ist shared_from_this() in Konstruktoren eingeschränkt?
Die Einschränkung von shared_from_this() in Konstruktoren ist auf die sequentielle Natur der Konstruktion zurückzuführen. Während der Konstruktor von Person ausgeführt wird, wurde noch kein shared_ptr erstellt, der auf das Person-Objekt verweisen könnte. Der shared_ptr wird extern nach der Konstruktion von Person erstellt.
Zugrundeliegender Mechanismus von shared_from_this()
enable_shared_from_this<> Bietet eine Möglichkeit, einen versteckten schwachen_ptr innerhalb des Objekts einzurichten. Dieser schwache_ptr wird dann vom ersten außerhalb des Objekts erstellten shared_ptr verwendet, um sich selbst zu initialisieren. Diese Initialisierung erfolgt jedoch nur, wenn ein shared_ptr extern erstellt wird.
Fazit
Während shared_from_this() die Erstellung gemeinsamer Zeiger auf Objekte von außerhalb ihrer Klasse ermöglicht, ist es Die Verwendung innerhalb des Konstruktors ist durch die Konstruktionsreihenfolge begrenzt. Der shared_ptr muss extern erstellt werden, nachdem die Konstruktion des Objekts abgeschlossen ist. Dies ist eine technische Einschränkung, die das korrekte Funktionieren gemeinsamer Zeiger gewährleistet.
Das obige ist der detaillierte Inhalt vonWarum kann „shared_from_this()' nicht direkt in Konstruktoren verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!