Maison >développement back-end >C++ >Comment éviter les dépendances circulaires lors de l'utilisation de std::shared_ptr de \'this\' ?

Comment éviter les dépendances circulaires lors de l'utilisation de std::shared_ptr de \'this\' ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-29 04:43:29577parcourir

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

std::shared_ptr de "this": Comprendre les dépendances circulaires

Hériter de std::enable_shared_from_this est la clé pour résoudre le "std ::shared_ptr de cette" énigme. En activant cela, vous pouvez invoquer .shared_from_this() pour obtenir un pointeur partagé vers l'objet actuel. Cependant, cela introduit une dépendance circulaire potentielle entre les objets parent et enfant.

Pour résoudre ce problème, il est recommandé d'utiliser std::weak_ptr pour la référence de l'enfant au parent. Cela empêche la formation de références circulaires fortes et protège contre les fuites de ressources. Le code modifié montre comment implémenter cette approche :

<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;

};

classe B {
public :

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

privé :

std::shared_ptr<A> parent;

};

Il est important de noter que l'invocation de .shared_from_this() nécessite que l'objet actuel soit géré par std::shared_ptr au moment de l'appel. Cela implique que la création de tels objets sur la pile n'est plus possible et qu'appeler .shared_from_this() à partir d'un constructeur ou d'un destructeur n'est généralement pas recommandé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn