Question

Considérez le code suivant.

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

Il est pas de sortie . Non desctructor est appelé. Fuite de mémoire. J'ai toujours cru que le pointeur intelligent permet d'éviter les fuites de mémoire.

Que dois-je faire si je besoin des références croisées dans les classes?

Était-ce utile?

La solution

Si vous avez des références circulaires comme celui-ci, un objet doit contenir un weak_ptr à l'autre, pas shared_ptr.

De l'introduction de shared_ptr :

  

Parce que la mise en œuvre utilise le comptage de référence, les cycles des instances de shared_ptr ne seront pas remis en état. Par exemple, si main() est titulaire d'un shared_ptr à A, qui détient directement ou indirectement un shared_ptr retour à A, le nombre d'utilisation de A sera 2. Destruction du shared_ptr d'origine laissera A ballants avec un nombre d'utilisation de 1. Utilisez weak_ptr pour « casser cycles ».

Merci, Glen, pour le lien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top