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 deshared_ptr
no se reclamarán. Por ejemplo, simain()
mantiene unshared_ptr
enA
, que directa o indirectamente mantiene unshared_ptr
enA
, el recuento de uso de A será 2. La destrucción delshared_ptr
original dejaráA
con un recuento de uso de 1. Useweak_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?