c++ - 如何使用weak_ptr打破shared_ptr循环引用

标签 c++ smart-pointers c++03

我读过weak_pointers 可以用来打破循环引用。

考虑下面的循环引用示例

struct A
{
boost::shared_ptr<A> shrd_ptr;
};


boost::shared_ptr<A> ptr_A(boost::make_shared<A>());
boost::shared_ptr<A> ptr_b(boost::make_shared<A>());
ptr_A->shrd_ptr = ptr_b;
ptr_b->shrd_ptr = ptr_A;

以上是循环引用的例子,我想知道如何破解 上面使用 weak_ptr 的循环引用?

更新: 根据收到的建议,我提出了以下建议:

struct A
{
  boost::weak_ptr<A> wk_ptr;
};

    boost::shared_ptr<A> ptr_A (boost::make_shared<A>());
    boost::shared_ptr<A> ptr_B (boost::make_shared<A>());
    ptr_A->wk_ptr = ptr_B;
    ptr_B->wk_ptr = ptr_A;

这会是正确的方法吗?

最佳答案

循环引用的经典例子是你有两个类 AB在哪里 A引用 B其中引用了 A :

#include <memory>
#include <iostream>

struct B;
struct A {
  std::shared_ptr<B> b;  
  ~A() { std::cout << "~A()\n"; }
};

struct B {
  std::shared_ptr<A> a;
  ~B() { std::cout << "~B()\n"; }  
};

void useAnB() {
  auto a = std::make_shared<A>();
  auto b = std::make_shared<B>();
  a->b = b;
  b->a = a;
}

int main() {
   useAnB();
   std::cout << "Finished using A and B\n";
}

如果两个引用都是 shared_ptr然后说A拥有 B 的所有权和 B拥有 A 的所有权,这应该敲响警钟。换句话说,A保留B还活着B保留A活着。

在此示例中,实例 ab仅用于 useAnB()函数,所以我们希望它们在函数结束时被销毁,但是正如我们在运行程序时看到的那样,没有调用析构函数。

解决方案是决定谁拥有谁。比方说A拥有 B但是 B不拥有A然后我们替换对 A 的引用在 Bweak_ptr像这样:

struct B {
  std::weak_ptr<A> a;
  ~B() { std::cout << "~B()\n"; }  
};

然后,如果我们运行程序,我们会看到 ab像我们预期的那样被销毁。

Live demo

编辑:在您的情况下,您建议的方法看起来非常有效。剥夺 A 的所有权和别的东西拥有A s。

关于c++ - 如何使用weak_ptr打破shared_ptr循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27085782/

相关文章:

c++ - 通过属性值从 vector 中删除对象的 unique_ptr

c++ - 查找引用 shared_ptr 的 weak_ptr

c++ - 如何创建类对象的 vector

c++ - 将数据从 OSX 应用程序推送到 nodeJS

c++ - 斐波那契数列的部分和的最后一位数字

c++ - 使用 COM 进行异常安全的内存处理

c++ - C++ 代码可以在 C++03 和 C++11 中都有效但做不同的事情吗?

c++ - 在 C++03 中仅使用标准函数获取 std::pair 成员

c++ - 转义(\)字符背后的魔法是什么

c++ - 链接静态库时VS2010查找调试符号