两个shared_ptr指针所指向对象的数据成员中,如果含有指向对方对象的share_ptr指针则会产生环状引用。通过例子来解释:

class A{

public:

shared_ptr<B> bptr;

~A(){cout<<"~A()"<<endl;}

};

class B{

public:

shared_ptr<A> aptr;

~B(){cout<<"~B()"<<endl;}

};

int main(){

shared_ptr<A> a(new A());

shared_ptr<B> b(nwe B());

a->bptr=b;

b->aptr=a;

}

  • 程序中通过new创建了一个类A的对象和一个类B的对象并通过shared_ptr指向它们,之后通过指向另一个对象的智能指针对自身的数据成员ptr进行赋值,因此两个对象的引用计数都为2.
  • 当程序退出时,main函数中创建的智能指针由于生命周期结束,其所指向对象的引用计数减1,但是由于环状引用,对象内部的智能指针的生命周期都不会结束,两个对象的引用计数始终为1.
  • 具体来讲,就是对象A中的智能指针bptr只有在对象A析构之后才会结束其生命周期,从而将对象B的引用计数降为0;二对象A并不会被销毁,因为对象A销毁的条件是指向A的智能指针的引用计数降为0,而对象B指向A的智能指针只有在B对象析构后才会结束其生命周期,从而将对象A的引用计数降为0.
  • 因此上述逻辑就成了一个死结,就好像两个人大家都就揪着对方的头发,并且叫嚣着只要对方松手自己就松手,但是两个人谁也不愿意首先让步,结果这两个人始终保持着同样的姿势,除非某一方实在坚持不住放弃了。
  • 程序中不存在某个对象坚持不住首先主动释放的情况,因此必须处理环状引用的问题。解决环状引用问题的钥匙就是weak_ptr,因为weak_ptr不会增加对象的引用计数。

class A{

public:

weak_ptr<B> bptr;

~A(){cout<<"~A()"<<endl;}

};

class B{

public:

weak_ptr<A> aptr;

~B(){cout<<"~B()"<<endl;}

};

int main(){

shared_ptr<A> a(new A());

shared_ptr<B> b(nwe B());

a->bptr=b;

b->aptr=a;

}

  • 将类中的智能指针类型有shared_ptr改为weak_ptr,在main函数中初始化两个智能指针时会将对象的引用计数加1,但是对类中的数据成员进行赋值时不会增加对象的引用计数。程序退出时,main函数中创建的两个智能指针生命周期结束,对象的引用计数由1减为0,对象空间释放。

简述环状引用问题及其解决方案相关推荐

  1. weak_ptr打破环状引用

    转自:http://blog.csdn.net/malong777/article/details/48974559 weak_ptr是一种不控制对象生存周期的智能指针,它指向一个shared_ptr ...

  2. CAS latex模板中参考文献使用APA引用格式的解决方案

    CAS latex模板中参考文献使用APA引用格式的解决方案 问题描述 解决方案 转发说明 问题描述 CAS模板中参考文献如何使用apa引用格式 解决方案 \usepackage[natbibapa] ...

  3. 论文编辑与投稿——word另存PDF显示“错误!未找到引用源”的解决方案

    一.报错示例 在论文中我们的参考文献.图.表.公式都需要使用引用这一功能,但是当我们需要将word另存为pdf格式后,有时这些引用位置会出现如下图所示的情况(word与pdf文件中会同时出现) Fig ...

  4. using System.Linq命名空间无法引用!的解决方案

    Visual Studio 2008中当建立新文件时,遇到这样的问题: "using System.Linq命名空间无法引用!!!" 解决方法:在解决方案上点击右键--添加引用-- ...

  5. App质量把控:简述质量问题现状及解决方案

    对于质量问题,直接以小故事的形式展开,下面是移动中台年度针对质量复盘的一些思考. 技术方案体现测试用例 对于业务项目来说,会存在测试资源.冒烟用例.精准测试.QA 新业务的业务回归.核心业务的 UI ...

  6. [ERROR] 两个jar包中存在Qualified Name完全相同的引用冲突问题 解决方案

    分析:   最近在搞Jedis,在引入jedis-2.9.0.jar和commons-pool2-2.4.2.jar后初始化JedisPoolConfig时,发现很多属性无法设置(如最大空闲连接等)编 ...

  7. 前后端分离的跨域解决方案

    声明: 在以往的开发中,前后端分离也不是像现在这么热门,所谓的前端工程师也只不过是写好静态页面由Java工程师或者php工程师嵌入到页面中进行开发,这或许加重了这些工程师的工作量,而且在样式调试上由纯 ...

  8. 【网易游戏面试题】.NET中强引用和弱引用是什么

    本文首发公众号洪流学堂.洪流学堂,让你快人几步. 今天分享一个网易游戏的面试题: 题目 请简述强引用和弱引用. 参考答案 我们平常用的都是对象的强引用,如果有强引用存在,GC是不会回收对象的.我们能不 ...

  9. Swift - 使用 Protocol 避免框架之间循环引用

    将高度复用的代码封装到静态库中不仅可以将代码解耦,还可以提高代码的可维护性.笔者所在公司的iOS项目是使用模块化开发的,项目中大量的可复用代码都被封装成静态库. 静态库的循环引用 设想这样的一个场景 ...

  10. 谈asp.net解决方案的项目生成时的输出路径

    今日将一个大的asp.net解决方案从VS2005升级为VS2008,本来以为由VS自动转换后就应该不会有问题.没想到出现了不少问题,弄了大半天. 其中的一个主要原因就是项目生成时的"输出路 ...

最新文章

  1. pandas对缺失值NaN处理
  2. 海康威视人证对比设备SDK-C#
  3. python运算符重载例子
  4. linux与window中sleep函数的头文件
  5. [转]Linux下使用dirname命令
  6. eclispe设置workspace text file encoding
  7. Android高仿大众点评(带服务端)
  8. idea类前面有个j_idea中所有Java类标识变成一个J
  9. 社会治理智慧平台、联动指挥、综合执法、数据汇集、数据研判、智慧政务、图表模板、大屏、可视化、智慧工厂、办公、能源、医疗、校园、自动化综合车间大屏、车间数据、人力资源、员工考核、医院、rp原型
  10. 高校学生学籍系统C++amp;mysql
  11. 在C ++中将String转换为Integer并将Integer转换为String
  12. 周期性行业是什么意思_什么样的股票适合长期持有?股票知识学习
  13. 【渝粤教育】国家开放大学2018年春季 8038-21T实用管理基础 参考试题
  14. 软件测试肖sir__简历模板制作
  15. Slf4j+logback实现日志打印-获取调用者类及方法行数信息
  16. 计算机考研专业课只考一科的学校汇总
  17. 笔记本电脑计计算机硬盘分区,笔记本电脑如何分区,教您笔记本电脑如何分盘...
  18. Unity3D动画帧事件
  19. 创建一个node 项目,node 知识点
  20. HTTPResponse

热门文章

  1. jquery常用方法收藏 .
  2. java源码-LinkedHashMap
  3. hinkPad T510系列主要机型对比
  4. selenium实现文件上传方法汇总(AutoIt、win32GUI、sengkeys)---基于python
  5. CentOS配置Nginx官方的Yum源 及yum安装php
  6. LeetCode 144. Binary Tree Preorder Traversal 20170706
  7. 使用Junit对Android应用进行单元测试
  8. Mysql 时间戳类型使用心得
  9. 创建data文件_剑指信奥 | C++ 之文件操作
  10. python自动检测网站_Web全自动化测试Python + Pytest+Selenium+ Saucelabs 转