Comment éviter la fuite de mémoire avec shared_ptr?
-
11-09-2019 - |
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?
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, simain()
est titulaire d'unshared_ptr
àA
, qui détient directement ou indirectement unshared_ptr
retour àA
, le nombre d'utilisation deA
sera 2. Destruction dushared_ptr
d'origine laisseraA
ballants avec un nombre d'utilisation de 1. Utilisezweak_ptr
pour « casser cycles ».
Merci, Glen, pour le lien.