2016-05-31 7 views
2

Ich habe zwei Klassen, A und B, die ein shared_ptr haben, das zueinander zeigt (A hat ein shared_ptr zu B, B hat ein shared_ptr zu A).Destruktor von gegenseitig rekursiver Klasse mit shared_from_this nicht

Ich versuche, den Destruktor beider Klassen aufgerufen zu bekommen, wenn man aus dem Geltungsbereich herauskommt, aber es funktioniert nicht. Kein Destruktor wird aufgerufen.

Hier ist ein Beispielcode:

class B; 

class A 
{ 
    public: 
     A() { std::cout << "Constructor A" << std::endl; } 
     ~A() { std::cout << "Destructor A" << std::endl; } 

     std::shared_ptr<B> b; 
}; 

class B 
{ 
    public: 
     B() { std::cout << "Constructor B" << std::endl; } 
     ~B() { std::cout << "Destructor B" << std::endl; } 

     std::shared_ptr<A> a; 
}; 

int main() 
{ 
    std::shared_ptr<A> a = std::make_shared<A>(); 
    a->b = std::make_shared<B>(); 

    a->b->a = a; 
} 

Wie könnte ich dieses Problem beheben?

+3

Klingt wie erwartetes Verhalten für mich, sie gehen nie aus dem Rahmen, da sie sich ewig gegenseitig referenzieren. –

+1

Dafür ist 'weak_ptr' gedacht – BeyelerStudios

Antwort

6

Entfernen Sie die circular reference.

Ein Objekt, das von intelligenten Zeigern verwaltet wird, wird nur zerstört, wenn der letzte Verweis auf das Objekt den Gültigkeitsbereich verlässt und der letzte verbleibende gemeinsame Zeiger für delete verantwortlich ist und das Objekt zerstört.

Ihr Code erstellt einen Zirkelverweis: ein Paar Objekte, die mit einem intelligenten Zeiger aufeinander verweisen. Daher gibt es immer einen intelligenten Zeiger, der auf das andere Objekt verweist, wobei der gemeinsame Zeiger jedes Objekts verhindert, dass das andere Objekt zerstört wird.

Bis diese Zirkelreferenz gebrochen ist, werden diese Objekte nicht zerstört.

Verwandte Themen