Heim > Artikel > Backend-Entwicklung > Warum können Sie „shared_from_this()“ nicht in Konstruktoren verwenden?
Die Einschränkungen von shared_from_this in Konstruktoren verstehen
Wie im Auszug aus „The C Standard Library“ angegeben, steht shared_from_this() vor einem technischen Problem Einschränkung innerhalb der Konstrukteure. Um dieses Konzept zu verstehen, ist es wichtig, in das Innenleben von shared_from_this() einzutauchen.
Die Rolle von Schwachstellen in shared_from_this
shared_from_this() beruht auf einem internen schwach_ptr, um einen schwachen Verweis auf das erstellte Objekt aufrechtzuerhalten. Dieser schwache Zeiger bleibt nicht initialisiert, bis ein starker shared_ptr (ein shared_ptr, dem das Objekt gehört) für das Objekt erstellt wird. Erst nachdem der erste shared_ptr instanziiert wurde, kann „enable_shared_from_this“, eine Basisklasse des Objekts, auf diesen shared_ptr zugreifen und den schwachen_ptr initialisieren.
Das Konstruktions-Timing-Problem
Diese Abhängigkeit von Vorhandene shared_ptrs stellen für Konstrukteure ein Problem dar. Wenn ein Konstruktor aufgerufen wird, ist noch kein shared_ptr vorhanden, der auf das zu erstellende Objekt verweist. Daher kann enable_shared_from_this während der Konstruktion seinen schwachen_ptr nicht initialisieren, wodurch shared_from_this() im Konstruktor unbrauchbar wird.
Ein Beispiel zur Verdeutlichung
Beachten Sie den folgenden Codeausschnitt:
class Person : public std::enable_shared_from_this<Person> { ... }; std::shared_ptr<Person> p(new Person());
In diesem Beispiel wird der Konstruktor von Person() vor dem Konstruktor von shared_ptr p ausgeführt. Das bedeutet, dass während des Person()-Konstruktors kein shared_ptr vorhanden ist, der auf das Person-Objekt zeigt, was enable_shared_from_this daran hindert, seinen schwachen_ptr zu initialisieren und den Zugriff auf shared_from_this() im Konstruktor unzugänglich macht.
Das obige ist der detaillierte Inhalt vonWarum können Sie „shared_from_this()“ nicht in Konstruktoren verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!