ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 如何使用weak_ptr中断shared_ptr循环引用

2019-09-28 14:08:32  阅读:307  来源: 互联网

标签:c smart-pointers c03


我已经读过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;

这是正确的方法吗?

解决方法:

循环引用的经典示例是您有两个类A和B,其中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活着.

在这个例子中,实例a和b仅在useAnB()函数中使用,因此我们希望它们在函数结束时被销毁,但正如我们在运行程序时所看到的那样,不会调用析构函数.

解决方案是决定谁拥有谁.让我们说A拥有B但是B不拥有A然后我们用一个weak_ptr替换B中A的引用,如下所示:

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

然后,如果我们运行该程序,我们会看到a和b被破坏,正如我们所期望的那样.

Live demo

编辑:在您的情况下,您建议的方法看起来完全有效.取得A的所有权和其他拥有As的东西.

标签:c,smart-pointers,c03
来源: https://codeday.me/bug/20190928/1827643.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有