2016-05-31 3 views
2

У меня есть два класса, A и B, которые имеют shared_ptr, указывающие друг на друга (A имеет shared_ptr для B, B имеет shared_ptr для A).Деструктор из взаимно-рекурсивного класса с shared_from_this не называется

Я пытаюсь получить деструктор обоих классов, вызываемых при выходе из области действия, но он не работает. Деструктор не называется.

Вот пример кода:

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

Как я мог это исправить?

+3

Звучит как ожидаемое поведение для меня, они никогда не выходят за рамки, поскольку они вечно ссылаются друг на друга. –

+1

вот что значит 'weak_ptr' для – BeyelerStudios

ответ

6

Удалить circular reference.

Объект, управляемый интеллектуальными указателями, уничтожается только в том случае, если последняя ссылка на объект выходит из области видимости, с последним, оставшимся общим указателем, ответственным за delete ing и уничтожающим объект.

Ваш код устанавливает круговую ссылку: пара объектов, указывающих друг на друга с помощью интеллектуального указателя. Таким образом, всегда есть умный указатель, который будет ссылаться на другой объект, причем общий указатель каждого объекта предотвращает уничтожение другого объекта.

Пока эта круговая ссылка не будет нарушена, эти объекты не будут уничтожены.