转载自:http://blog.csdn.net/segen_jaa/article/details/8080167

参考文章:http://www.cnblogs.com/TianFang/archive/2008/09/20/1294590.html。

前言:C++中智能指针的引入,使得开发人员在与内存的斗争中占据上峰。然而凡事都不会尽善尽美,智能指针的循环引用缺陷还是会引发令人谈虎色变的内存泄露。本文的内容就是讲述,如何解决循环引用带来的内存问题。

背景:智能指针采用Boost库,语言C++,开发工具VS2005,示例程序为Win32程序。
关于Boost库的使用,可见另一篇文章http://blog.csdn.net/segen_jaa/article/details/7407404。

循环引用示例

[cpp] view plaincopy
  1. #include "stdafx.h"
  2. #include <string>
  3. #include <iostream>
  4. #include <boost/shared_ptr.hpp>
  5. #include <boost/weak_ptr.hpp>
  6. using namespace std;
  7. using namespace boost;
  8. class CCycleRef
  9. {
  10. public:
  11. ~CCycleRef()
  12. {
  13. cout <<"destroying CCycleRef"<<endl;
  14. }
  15. public:
  16. shared_ptr<CCycleRef> selfRef;
  17. };
  18. void CycleRefTest()
  19. {
  20. shared_ptr<CCycleRef> cyclRef(new CCycleRef());
  21. cyclRef->selfRef = cyclRef;
  22. cout<<"reference count:"<<cyclRef.use_count()<<endl;
  23. }
  24. int _tmain(int argc, _TCHAR* argv[])
  25. {
  26. CycleRefTest();
  27. return 0;
  28. }

运行结果:

reference count:2

创建的CCycleRef对象没有释放掉。
原因是CCycleRef类进行了自引用,引用计数增加所致,类图如下。

循环引用解决

引入weak_ptr弱引用指针即可解决循环引用问题。weak_ptr不会修改引用计数。
修改CCycleRef类。

[cpp] view plaincopy
  1. class CCycleRef
  2. {
  3. public:
  4. ~CCycleRef()
  5. {
  6. cout <<"destroying CCycleRef"<<endl;
  7. }
  8. public:
  9. weak_ptr<CCycleRef> selfRef;
  10. };

运行结果
reference count:1
destroying CCycleRef

创建的CCycleRef对象已被释放。

转载于:https://www.cnblogs.com/zhangzhang/archive/2013/03/04/2942637.html

[zz] C++智能指针循环引用解决相关推荐

  1. 智能指针循环引用问题

    智能指针循环引用 循环引用简单来说就是:两个对象互相使用一个shared_ptr成员变量指向对方,这会造成循环引用.导致引用计数失效,内存无法释放. #include <iostream> ...

  2. 智能指针循环引用——你真的懂了吗?

    相信不少同学都在面试中都被问到过c++智能指针的问题,接踵而至的必定是循环引用了,而我每次的答案都是一招鲜:因为它们都在互相等待对方先释放,所以造成内存泄漏.面试官很满意,我也很满意. 但是为啥要等到 ...

  3. SpringBoot:循环引用解决方式

    SpringBoot:循环引用解决方式 1 前言 SpringBoot启动时提示循环引用: Relying upon circular references is discouraged and th ...

  4. 【C++】智能指针简述(五):解决循环引用的weak_ptr

    总结一下前文内容: 1.智能指针通过RAII方法来管理指针:构造对象时,完成资源初始化;析构对象时,对资源进行清理及汕尾. 2.auto_ptr,通过"转移所有权"来防止析构一块内 ...

  5. VTK修炼之道80:VTK开发基础_智能指针与引用计数

    1.引用计数 VTK经过多年的开发与维护,已经形成了一套稳定的框架和开发规则.因此,了解这些规则和框架是定制VTK类的基础,这其中用到了大量面向对象的设计模式,例如对象工程模式.观察者/命令模式:还有 ...

  6. c++智能指针与引用计数

    一. 引用计数 先写一个简单的学生类 #include<iostream> #include <string.h> using namespace std;class stud ...

  7. C++(9)--裸指针、智能指针、引用

    指针 1.裸指针的基本概念 1.1 裸指针的声明*/初始化& 1.2 操作裸指针--间接运算符* 1.3 裸指针使用 demo--指向一个简单变量 1.4 空指针--nullptr 1.5 特 ...

  8. python循环引用解决 cannot import partially initialize

    文章目录 1. 问题 2. 程序结构 3. 健康的引用关系 1. 问题 在python项目中,通常我们要将功能划分为多个文件, 可能出现一些,各模块需要一些公共的值.实例,同时相互存在循环引用的问题. ...

  9. 智能指针shared_ptr引用计数工作原理

    引用计数原理 shared_ptr的实现是这样的:  shared_ptr模板类有一个__shared_count类型的成员_M_refcount来处理引用计数的问题.__shared_count也是 ...

最新文章

  1. 如何获取URL中的参数
  2. model.fit以及model.fit_generator区别及用法
  3. 爱是谋杀:读徐小斌的《别人》
  4. 装mysql最后一步没响应_解决MySQL安装到最后一步未响应的三种方法
  5. 今天一看,自己发的文章原来这么多了。openeim
  6. 再见2019,拥抱2020
  7. 判断相等_为什么不建议你用a.equals(b)判断对象相等
  8. JQuery - 提交表单
  9. RVC使用指南(一)-基本配置
  10. 微服务升级_SpringCloud Alibaba工作笔记0009---阿里云部署微服务_在内网不同机器上_报错_注册中心找不到对应的机器_遇到java.net.UnknownHostExceptio
  11. 18.XML CDATA
  12. jsp java ldquo_添加jsp · yayaangel/java201521123103 - Gitee.com
  13. windows7安装cuda10.2
  14. SVN客户端安装使用教程
  15. 微信小程序做出 物流签收信息(步骤条) 源码
  16. axios和ajax怎么读,axios, ajax和fetch的比较
  17. 3个步骤+1个模型,原来「数据分析」才是「增长黑客」的核心技能!
  18. 【hadoop生态之Hive】Hive的DML数据操纵语言【笔记+代码】
  19. 程序媛的2013总结以及2014展望
  20. html+php教程,HTML入门教程

热门文章

  1. JZOJ 3806. 【NOIP2014模拟8.24】小X 的道路修建
  2. python打印二进制内容,Python字节不打印二进制
  3. emmap erlang_erlang的map基本使用
  4. 转]一个计算机专业学生几年的Java编程经验汇总
  5. Codeforces 1326F Wise Men (容斥原理、状压 DP、划分数)
  6. Codeforces 1106F Lunar New Year and a Recursive Sequence (线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...
  7. python绘制指数函数图像及性质_指数函数图像及其性质正式版
  8. 2012自动登录服务器,配置Windows自动登录 - Windows Server | Microsoft Docs
  9. redis延迟队列 如何确保成功消费_千万级延时任务队列如何实现,看美图开源的-LMSTFY...
  10. python gpu加速 显卡_PyTorch-GPU加速实例