boost :: shared_ptr use_count
-
23-08-2019 - |
Pregunta
Estoy tratando de entender lo que está pasando en el siguiente código. Cuando se elimina objeto-a, hace que es miembro de shared_ptr variable de objeto-b permanece en la memoria porque objeto-c tiene un shared_ptr a oponerse-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;
}
Solución
El A
-objeto será limpiado tan pronto como a
se elimina al final de su bloque. Pero el shared_ptr que contiene fue copiado posteriormente, incrementando su contador de referencia.
Así, el B
-objeto tendrá un recuento de referencia de 2 después de c.setRef
(referenciado por el A
a objetos y por C
del shared_ptr
-objeto). Cuando a
se elimina al final de su bloque, entonces el contador de referencia de la B
a objetos cae a 1
de nuevo ya que sólo shared_ptr de c
hace referencia ahora.
Después de c
se destruye al final del principal, su shared_ptr
será destruido también como parte de la destrucción de c
, y ahora como el recuento de referencias llega a cero, el objeto con punta-a B
será borrada shared_ptr
.
Por lo tanto, la cuenta de referencia del B
a objetos:
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)
Otros consejos
No, cuando un suprimidas, -.> _ B (el puntero en sí) dejará de existir
La objeto que a -.> _ B puntos a seguirá existiendo, porque c._b todavía señala a ella
El objetivo de la shared_ptr
permanecerá vivo hasta que se elimine la referencia final a la misma. En este caso, esto será cuando la instancia C
sale del ámbito.