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;
}

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?

Foi útil?

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, se main() detém uma shared_ptr para A, que detém directa ou indirectamente uma volta shared_ptr para A, contagem de uso de A será 2. Destruição do shared_ptr originais vai deixar A pendurada com uma contagem de uso de 1. Use weak_ptr "quebrar ciclos ".

Obrigado, Glen, para a ligação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top