2016-05-31 53 views
2

我有两个类A和B,它们有一个指向彼此的shared_ptr(A有一个shared_ptr到B,B有一个到A的shared_ptr)。来自互斥递归类的析构函数与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

只有当对象的最后一个引用超出了作用域时,由智能指针管理的对象才会被销毁,最后一个剩余的共享指针负责对象的销毁和销毁。

您的代码设置了一个循环引用:一对使用智能指针相互指向的对象。因此,总是有一个智能指针可以引用另一个对象,每个对象的共享指针可以防止其他对象被破坏。

在此循环引用被破坏之前,这些对象不会被销毁。