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_ptrinstancias deshared_ptrno se reclamarán. Por ejemplo, simain()mantiene unshared_ptrenA, que directa o indirectamente mantiene unshared_ptrenA, el recuento de uso de A será 2. La destrucción delshared_ptroriginal dejaráAcon un recuento de uso de 1. Useweak_ptrpara "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?