Question

Je suis en train de comprendre ce qui se passe dans le code suivant. Lorsque objet a est supprimé, il est fait membre shared_ptr la variable objet b reste en mémoire parce que l'objet-c est titulaire d'un shared_ptr à l'objet-b?

    class B
    {
    public:
       B(int val)
       {
          _val = val;
       }
       int _val;
    };

    class A
    {
    public:
       A()
       {
          _b = new B(121);
       }
       boost::shared_ptr<B> _b;
    };

    class C
    {
    public:
       C()
       {
       }

       void setRef( boost::shared_ptr<B> b)
       {
          _b = b;
       }
       boost::shared_ptr<B> _b;
    };

    int main()
    {
       C c;
       {
          A *a = new A();       
          cout << "a._b.use_count: " << a->_b.use_count() << endl;
          c.setRef(a->_b);
          cout << "a._b.use_count: " << a->_b.use_count() << endl;
                  delete a;
       }
       cout << c._b->_val << endl;
    }
Était-ce utile?

La solution

Le A objet sera nettoyé dès a est supprimé à la fin de son bloc. Mais le shared_ptr qu'il contient a ensuite été copié, incrémenter son compteur de références.

Ainsi, le B objet aura un compte de référence de 2 après c.setRef (référencé par le A-objet et par le C du shared_ptr-objet). Lorsque a est supprimé à la fin de son bloc, le compte de référence des gouttes d'B-objet à 1 à nouveau depuis que la shared_ptr de c fait référence maintenant.

Après c est détruite à la fin de la principale, son shared_ptr sera détruit aussi dans le cadre de la destruction de c, et maintenant que le nombre de référence tombe à zéro, l'objet pointé à B sera supprimée par shared_ptr.

Ainsi, les chefs d'accusation de référence du B-objet:

0: before existence of a.
1: from start of lifetime of a until c.setRef
2: from c.setRef until copy of its parameter
3: from copy of c.setRef''s parameter until return of it
2: from return of c.setRef until end of a''s block
1: from end of a''s block until end of main
0: after main returned (object doesn''t exist anymore now)

Autres conseils

Non, lorsqu'un est supprimé, a -.> _ B (le pointeur lui-même) cessera d'exister

objet a -.> _ Points b pour continueront d'exister, parce c._b encore des points à elle

L'objectif du shared_ptr restera en direct jusqu'à ce que la dernière référence, il est supprimé. Dans ce cas, ce sera lorsque l'instance C est hors de portée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top