Maison > Article > développement back-end > Comment puis-je transmettre en toute sécurité un « std::shared_ptr » de « this » à un objet associé ?
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.
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>
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!