Maison  >  Article  >  développement back-end  >  Comment puis-je transmettre en toute sécurité un « std::shared_ptr » de « this » à un objet associé ?

Comment puis-je transmettre en toute sécurité un « std::shared_ptr » de « this » à un objet associé ?

DDD
DDDoriginal
2024-10-28 21:01:30831parcourir

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

Comprendre le dilemme "std::shared_ptr de ce"

Dans l'utilisation du pointeur intelligent, il arrive souvent qu'un scénario se présente dans lequel deux objets liés, A et B, nécessitent l'accès à l'un l'autre. Cependant, passer std::shared_ptr pour établir cette connexion devient difficile.

Par exemple, considérons la classe A, le parent, qui doit ajouter un objet enfant B. La méthode addChild du parent devrait idéalement transmettre un std:: shared_ptr à l'enfant, afin qu'il puisse référencer le parent.

Cependant, une tentative directe child->setParent(this) échoue car le pointeur this est une rvalue. Pour résoudre ce problème, C propose std::enable_shared_from_this.

Solution : std::enable_shared_from_this

std::enable_shared_from_this est un modèle de classe qui facilite le partage d'un objet via std::shared_ptr. En en héritant, vous accédez à shared_from_this(), qui fournit le std::shared_ptr nécessaire, comme le montre le code modifié :

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

De plus, pour éviter les dépendances circulaires qui pourraient entraîner des fuites de mémoire , il est conseillé d'utiliser std::weak_ptr pour les enfants qui dépendent de l'existence de leurs parents :

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

Précautions

Il est important de noter que .shared_from_this() ne doit être appelé que lorsque l'appel l'objet est géré par std::shared_ptr. Cela signifie qu'il ne peut pas être créé sur la pile et ne peut généralement pas être appelé dans des constructeurs ou des destructeurs.

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