Como evitar vazamento de memória com shared_ptr?
-
11-09-2019 - |
Pergunta
Considere o seguinte 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;
}
Há sem saída . Não desctructor é chamado. Vazamento de memória. Eu sempre acreditei que o ponteiro inteligente ajuda a evitar vazamentos de memória.
O que devo fazer se eu precisar de referências cruzadas nas classes?
Solução
Se você tem referências circulares como este, um objeto deve manter uma weak_ptr
para o outro, não um shared_ptr
.
A partir introdução shared_ptr
:
Como a implementação utiliza contagem de referência, ciclos de casos
shared_ptr
não será recuperada. Por exemplo, semain()
detém umashared_ptr
paraA
, que detém directa ou indirectamente uma voltashared_ptr
paraA
, contagem de uso deA
será 2. Destruição doshared_ptr
originais vai deixarA
pendurada com uma contagem de uso de 1. Useweak_ptr
"quebrar ciclos ".
Obrigado, Glen, para a ligação.