Wie Speicherleck mit shared_ptr zu vermeiden?
-
11-09-2019 - |
Frage
Betrachten Sie den folgenden Code ein.
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;
}
Es ist keine Ausgabe . No desctructor aufgerufen. Speicherleck. Ich habe immer geglaubt, dass der Smart-Pointer hilft Speicherlecks zu vermeiden.
Was soll ich tun, wenn ich Querverweise in den Klassen müssen?
Lösung
Wenn Sie zirkuläre Referenzen wie diese haben, sollte ein Objekt halten eine weak_ptr
zum anderen, nicht ein shared_ptr
.
Da die Implementierung der Referenzzählung verwendet werden Zyklen von
shared_ptr
Instanzen nicht sanierendem. Zum Beispiel, wennmain()
eineshared_ptr
hält,A
, die direkt oder indirekt einenshared_ptr
zurück zuA
wird,A
die Nutzung Zählung Zerstörung des ursprünglichenshared_ptr
sein 2.A
baumelt mit einer Verwendungsanzahl von 1. Verwenden Sieweak_ptr
verlassen hält zu „brechen Zyklen. "
Danke, Glen, für den Link.