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;
    }
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top