来自相互递归类的析构函数,并且未调用shared_from_this

Adr*_*veu 2 c++ shared-ptr circular-reference

我有两个类,A和B,它们有一个指向彼此的shared_ptr(A有一个shared_ptr到B,B有一个shared_ptr到A).

我试图在退出范围时调用两个类的析构函数,但它不起作用.没有析构函数被调用.

这是一个示例代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

我怎么能解决这个问题?

Sam*_*hik 6

删除循环引用.

仅当对象的最后一个引用超出范围时,由智能指针管理的对象才会被销毁,最后一个剩余的共享指针负责delete对象的销毁和销毁.

您的代码设置了一个循环引用:一对使用智能指针指向彼此的对象.因此,总会有一个智能指针引用另一个对象,每个对象的共享指针阻止其他对象被破坏.

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