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?

War es hilfreich?

Lösung

Wenn Sie zirkuläre Referenzen wie diese haben, sollte ein Objekt halten eine weak_ptr zum anderen, nicht ein shared_ptr.

der shared_ptr Einführung :

  

Da die Implementierung der Referenzzählung verwendet werden Zyklen von shared_ptr Instanzen nicht sanierendem. Zum Beispiel, wenn main() eine shared_ptr hält, A, die direkt oder indirekt einen shared_ptr zurück zu A wird, A die Nutzung Zählung Zerstörung des ursprünglichen shared_ptr sein 2. A baumelt mit einer Verwendungsanzahl von 1. Verwenden Sie weak_ptr verlassen hält zu „brechen Zyklen. "

Danke, Glen, für den Link.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top