Maison >développement back-end >C++ >Comment pouvez-vous créer un `std::shared_ptr` de l'objet actuel (this) à transmettre aux objets enfants lorsque vous utilisez `std::shared_ptr` pour la propriété ?

Comment pouvez-vous créer un `std::shared_ptr` de l'objet actuel (this) à transmettre aux objets enfants lorsque vous utilisez `std::shared_ptr` pour la propriété ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-29 02:53:02507parcourir

How can you create a `std::shared_ptr` of the current object (this) to pass to child objects when using `std::shared_ptr` for ownership?

L'énigme de "std::shared_ptr de ceci"

Dans le domaine des pointeurs intelligents, les programmeurs se retrouvent souvent aux prises avec des problèmes complexes réseau de propriété des objets et de gestion de la durée de vie. Un de ces défis survient lorsque l'on tente de transmettre un std::shared_ptr de l'objet actuel à son enfant.

Considérons le scénario suivant : un objet de classe A contient une liste d'enfants de classe B, alors que chaque enfant a besoin pour conserver une référence à son parent. Cette tâche apparemment simple présente un obstacle lorsque nous tentons de créer un std::shared_ptr pointant vers l'objet parent.

<code class="cpp">class A {
private:
    std::list<std::shared_ptr<B>> children;
};

class B {
public:
    void setParent(std::shared_ptr<A> parent) { ... }
};</code>

Comment transmettre un std::shared_ptr de l'objet A actuel à ses enfants ?

La réponse : std::enable_shared_from_this

La solution réside dans la classe de modèle std::enable_shared_from_this. En en héritant, un objet acquiert la capacité de se créer un shared_ptr via la méthode shared_from_this.

Pour résoudre notre dilemme, nous modifions notre classe A en conséquence :

<code class="cpp">class A : public std::enable_shared_from_this<A> {
    // ...
    void addChild(std::shared_ptr<B> child) {
        children.push_back(child);
        child->setParent(shared_from_this());
    }
};</code>

Maintenant, nous pouvons transmettre sans effort un shared_ptr de l'objet parent à ses enfants.

Une mise en garde : dépendances circulaires et fuites de ressources

Cependant, notre solution introduit un problème potentiel : circulaire dépendances. En conservant des références à la fois au parent et aux enfants, nous créons un cycle dans lequel chaque objet repose sur l'existence de l'autre. Cela peut entraîner des fuites de ressources si les objets ne sont pas correctement libérés.

Pour atténuer ce problème, nous utilisons std::weak_ptr pour les références des enfants à leur parent. Les pointeurs faibles n'empêchent pas la suppression de l'objet référencé et sont automatiquement annulés lors de la suppression.

<code class="cpp">class A {
private:
    std::list<std::weak_ptr<B>> children;
};</code>

Avec cet ajustement, la dépendance circulaire est rompue, garantissant une destruction correcte de l'objet et empêchant les fuites de mémoire.

Limitations : propriété et timing

Il est important de noter que l'appel de shared_from_this() nécessite que l'objet actuel appartienne à std::shared_ptr au moment de l'appel. Cela implique que l'objet ne peut pas être créé sur la pile ou appelé dans un constructeur ou un destructeur.

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