Pregunta

Considere el siguiente código.

using boost::shared_ptr;
struct B;
struct A{
    ~A() { std::cout << "~A" << std::endl; }
    shared_ptr<B> b;    
};
struct B {
    ~B() { std::cout << "~B" << std::endl; }
    shared_ptr<A> a;
};

int main() {
    shared_ptr<A> a (new A);
    shared_ptr<B> b (new B);
    a->b = b;
    b->a = a;

    return 0;
}

No es sin salida . No desctructor se llama. Pérdida de memoria. Siempre he creído que el puntero inteligente ayuda a evitar pérdidas de memoria.

¿Qué debo hacer si necesito referencias cruzadas en las clases?

¿Fue útil?

Solución

Si usted tiene referencias circulares de este tipo, un objeto debe contener un weak_ptr a la otra, no un shared_ptr.

la introducción shared_ptr :

  

Debido a que la aplicación utiliza el recuento de referencias, no serán recuperados ciclos de casos shared_ptr. Por ejemplo, si tiene un main() shared_ptr a A, que posee directa o indirectamente, una shared_ptr de nuevo a A, el recuento de uso de A será 2. Destrucción de la shared_ptr originales dejará A colgando con un recuento de uso de 1. Uso weak_ptr para "romper ciclos ".

Gracias, Glen, para el enlace.

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