Maison >développement back-end >C++ >Qu'est-ce que «enable_shared_from_this» et comment crée-t-il en toute sécurité des instances «shared_ptr» ?

Qu'est-ce que «enable_shared_from_this» et comment crée-t-il en toute sécurité des instances «shared_ptr» ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-17 04:36:25461parcourir

What is `enable_shared_from_this` and how does it safely create `shared_ptr` instances?

Qu'est-ce que activate_shared_from_this et pourquoi est-il utile ?

Introduction

Pendant l'exploration de Boost. Comme exemples, vous pouvez rencontrer activate_shared_from_this, vous laissant perplexe quant à sa bonne application. Cet article vise à fournir une explication complète et un exemple de cas où l'utilisation de cette classe est logique.

Comprendre activate_shared_from_this

enable_shared_from_this est une classe utilitaire qui facilite la conversion d'un pointeur (comme celui-ci) dans une instance shared_ptr valide. Sans cela, accéder à un shared_ptr à l'objet actuel serait impossible à moins qu'il ne soit explicitement stocké en tant que variable membre.

Exemple et explication

Considérez l'exemple suivant :

class Y : public enable_shared_from_this<Y>
{
public:

    shared_ptr<Y> f()
    {
        return shared_from_this();
    }
};

int main()
{
    shared_ptr<Y> p(new Y);
    shared_ptr<Y> q = p->f();
    assert(p == q);
    assert(!(p < q || q < p)); // p and q must share ownership
}

Dans cet exemple, la méthode f() renvoie un shared_ptr valide, même si elle n'a pas d'instance membre de partagé_ptr. La classe activate_shared_from_this permet cette conversion. Il est important de noter que l'approche suivante est incorrecte :

class Y : public enable_shared_from_this<Y>
{
public:

    shared_ptr<Y> f()
    {
        return shared_ptr<Y>(this);
    }
};

Cela entraînerait des pointeurs partagés avec des nombres de références différents, conduisant à des références potentiellement pendantes lorsque l'objet est supprimé.

Conclusion

enable_shared_from_this est un outil précieux pour créer une instance shared_ptr de l'objet actuel, lorsque vous n'avoir accès qu'à un pointeur régulier. Il évite les références pendantes et garantit une bonne gestion des ressources. Cette fonctionnalité est désormais également disponible dans le cadre de la norme C 11.

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