Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verhindert man zirkuläre Abhängigkeiten bei der Verwendung von std::shared_ptr von „this“?

Wie verhindert man zirkuläre Abhängigkeiten bei der Verwendung von std::shared_ptr von „this“?

Linda Hamilton
Linda HamiltonOriginal
2024-10-29 04:43:29515Durchsuche

How to Prevent Circular Dependencies When Using std::shared_ptr of

std::shared_ptr von „this“: Zirkuläre Abhängigkeiten verstehen

Das Erben von std::enable_shared_from_this ist der Schlüssel zum Auflösen des „std.“ ::shared_ptr dieses" Rätsels. Wenn Sie dies aktivieren, können Sie .shared_from_this() aufrufen, um einen gemeinsamen Zeiger auf das aktuelle Objekt zu erhalten. Dies führt jedoch zu einer potenziellen zirkulären Abhängigkeit zwischen den übergeordneten und untergeordneten Objekten.

Um dieses Problem zu beheben, wird empfohlen, std::weak_ptr für den Verweis des untergeordneten Objekts auf das übergeordnete Objekt zu verwenden. Dies verhindert die Bildung starker Zirkelverweise und schützt vor Ressourcenlecks. Der geänderte Code zeigt, wie dieser Ansatz implementiert wird:

<br>class A : public std::enable_shared_from_this<a> {<br>public:</a></p>
<pre class="brush:php;toolbar:false">void addChild(std::shared_ptr<B> child) {
    children.push_back(child);
    child->setParent(shared_from_this());
}

private :

std::list<std::weak_ptr<B>> children;

};

Klasse B {
öffentlich:

void setParent(std::shared_ptr<A> parent) {
    this->parent = parent;
}

privat:

std::shared_ptr<A> parent;

};

Es ist wichtig zu beachten, dass der Aufruf von .shared_from_this() erfordert, dass das aktuelle Objekt zum Zeitpunkt des Aufrufs von std::shared_ptr verwaltet wird. Dies bedeutet, dass das Erstellen solcher Objekte auf dem Stapel nicht mehr möglich ist und der Aufruf von .shared_from_this() von einem Konstruktor oder Destruktor aus im Allgemeinen nicht empfohlen wird.

Das obige ist der detaillierte Inhalt vonWie verhindert man zirkuläre Abhängigkeiten bei der Verwendung von std::shared_ptr von „this“?. 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