相互递归 class 和 shared_from_this 的析构函数未被调用
Destructor from mutually recursive class with shared_from_this not called
我有两个 类,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;
}
我该如何解决这个问题?
由智能指针管理的对象仅在对对象的最后一次引用超出范围时才会被销毁,最后一个剩余的共享指针负责delete
创建和销毁对象。
您的代码设置了循环引用:一对使用智能指针相互指向的对象。因此,总是有一个智能指针将引用另一个对象,每个对象的共享指针防止另一个对象被破坏。
在这个循环引用被破坏之前,这些对象不会被销毁。
我有两个 类,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;
}
我该如何解决这个问题?
由智能指针管理的对象仅在对对象的最后一次引用超出范围时才会被销毁,最后一个剩余的共享指针负责delete
创建和销毁对象。
您的代码设置了循环引用:一对使用智能指针相互指向的对象。因此,总是有一个智能指针将引用另一个对象,每个对象的共享指针防止另一个对象被破坏。
在这个循环引用被破坏之前,这些对象不会被销毁。