Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich ein „std::shared_ptr“ von „this“ sicher an ein verwandtes Objekt übergeben?

Wie kann ich ein „std::shared_ptr“ von „this“ sicher an ein verwandtes Objekt übergeben?

DDD
DDDOriginal
2024-10-28 21:01:30755Durchsuche

How Can I Safely Pass a `std::shared_ptr` of `this` to a Related Object?

Das „std::shared_ptr“-Dilemma verstehen

Bei der Verwendung von Smart Pointern tritt häufig ein Szenario auf, in dem zwei verwandte Objekte, A und B, Zugriff benötigen gegenseitig. Die Übergabe von std::shared_ptr zum Herstellen dieser Verbindung wird jedoch zu einer Herausforderung.

Betrachten Sie beispielsweise Klasse A, das übergeordnete Objekt, das ein untergeordnetes Objekt B hinzufügen muss. Die addChild-Methode des übergeordneten Objekts sollte idealerweise ein std:: übergeben. shared_ptr an das untergeordnete Element, damit es auf das übergeordnete Element verweisen kann.

Ein direkter untergeordneter->setParent(this)-Versuch schlägt jedoch fehl, da dieser Zeiger ein R-Wert ist. Um dieses Problem zu lösen, bietet C std::enable_shared_from_this an.

Lösung: std::enable_shared_from_this

std::enable_shared_from_this ist eine Klassenvorlage, die das Teilen eines Objekts über std::shared_ptr erleichtert. Indem Sie davon erben, erhalten Sie Zugriff auf shared_from_this(), das den notwendigen std::shared_ptr bereitstellt, wie im geänderten Code zu sehen ist:

<code class="cpp">class A : public std::enable_shared_from_this<A> {
...
child->setParent(shared_from_this()); // now valid
};</code>

Zusätzlich, um zirkuläre Abhängigkeiten zu verhindern, die zu Speicherlecks führen könnten , ist es ratsam, std::weak_ptr für Kinder zu verwenden, die von der Existenz ihrer Eltern abhängig sind:

<code class="cpp">std::list<std::weak_ptr<B>> children; // now using weak_ptr</code>

Vorsichtsmaßnahmen

Es ist wichtig zu beachten, dass .shared_from_this() nur beim Aufruf aufgerufen werden sollte Das Objekt wird von std::shared_ptr verwaltet. Dies bedeutet, dass es nicht auf dem Stapel erstellt werden kann und normalerweise nicht in Konstruktoren oder Destruktoren aufgerufen werden kann.

Das obige ist der detaillierte Inhalt vonWie kann ich ein „std::shared_ptr“ von „this“ sicher an ein verwandtes Objekt übergeben?. 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