¿Cómo evitar la pérdida de memoria con shared_ptr?
-
11-09-2019 - |
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?
Solución
Si usted tiene referencias circulares de este tipo, un objeto debe contener un weak_ptr
a la otra, no un 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 unmain()
shared_ptr
aA
, que posee directa o indirectamente, unashared_ptr
de nuevo aA
, el recuento de uso deA
será 2. Destrucción de lashared_ptr
originales dejaráA
colgando con un recuento de uso de 1. Usoweak_ptr
para "romper ciclos ".
Gracias, Glen, para el enlace.