c++ boost memory-leaks shared-ptr smart-pointers

c++ - ¿Cómo evitar la pérdida de memoria con shared_ptr?



boost memory-leaks (1)

Si tiene referencias circulares como esta, un objeto debe contener un valor weak_ptr para el otro, no un valor shared_ptr .

De la introducción shared_ptr :

Debido a que la implementación utiliza el recuento de referencias, los ciclos de shared_ptr instancias de shared_ptr no se reclamarán. Por ejemplo, si main() mantiene un shared_ptr en A , que directa o indirectamente mantiene un shared_ptr en A , el recuento de uso de A será 2. La destrucción del shared_ptr original dejará A con un recuento de uso de 1. Use weak_ptr para "romper ciclos".

Gracias, Glen, por el enlace.

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 hay salida . No se llama desctructor . Pérdida de memoria. Siempre he creído que el puntero inteligente ayuda a evitar las fugas de memoria.

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