Heim >Backend-Entwicklung >C++ >Warum kann „shared_from_this()' nicht direkt in Konstruktoren verwendet werden?

Warum kann „shared_from_this()' nicht direkt in Konstruktoren verwendet werden?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-05 21:00:04409Durchsuche

Why Can't `shared_from_this()` Be Used Directly in Constructors?

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:

  • Selbstspeichernder shared_ptr: Der gespeicherte shared_ptr ist der tatsächliche shared_ptr, der außerhalb der Klasse erstellt wurde.
  • Zeitpunkt der Konstruktion: Die Speicherung des shared_ptr erfolgt am Ende der Konstruktion der Person Prozess.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn