【问题标题】:Destructor from mutually recursive class with shared_from_this not called [duplicate]互递归类的析构函数,shared_from_this 未调用 [重复]
【发布时间】:2016-05-31 10:38:30
【问题描述】:

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

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

这是一个示例代码:

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

我该如何解决这个问题?

【问题讨论】:

  • 对我来说听起来像是预期的行为,它们永远不会超出范围,因为它们会永远相互引用。
  • 这就是weak_ptr 的用途

标签: c++ shared-ptr circular-reference


【解决方案1】:

删除circular reference

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2015-03-04
    • 2015-04-05
    相关资源
    最近更新 更多