boost :: shared_ptr use_count
-
23-08-2019 - |
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;
}
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.