博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[zz] C++智能指针循环引用解决
阅读量:5278 次
发布时间:2019-06-14

本文共 1105 字,大约阅读时间需要 3 分钟。

转载自:

参考文章:。

前言:C++中智能指针的引入,使得开发人员在与内存的斗争中占据上峰。然而凡事都不会尽善尽美,智能指针的循环引用缺陷还是会引发令人谈虎色变的内存泄露。本文的内容就是讲述,如何解决循环引用带来的内存问题。
背景:智能指针采用Boost库,语言C++,开发工具VS2005,示例程序为Win32程序。
关于Boost库的使用,可见另一篇文章。

循环引用示例

 

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

运行结果:

 

reference count:2

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

 

循环引用解决

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

修改CCycleRef类。

 

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

运行结果
reference count:1
destroying CCycleRef
创建的CCycleRef对象已被释放。

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

你可能感兴趣的文章
C#实现动态引用外部的Javascript,CSS
查看>>
XMLHttpRequest对象的属性与方法
查看>>
Pots bfs
查看>>
Python Indentation
查看>>
setInterval()与setTimeout()的区别
查看>>
PhoneGap API帮助文档翻译—File(文件)
查看>>
混合开发模式下主流移动开发平台分析
查看>>
POJ 1422 Air Raid
查看>>
java常用集合浅层解析-面试必备
查看>>
Linux 系统开机启动项清理
查看>>
Tensorflow-slim 学习笔记(二)第一层目录代码解读
查看>>
投资界人物和书
查看>>
TCP/CP调试
查看>>
Linux安装pt-toolkit
查看>>
使用正则表达式自动匹配并获取所需要的数据
查看>>
Linux-grep命令
查看>>
absoluteLayout绝对布局
查看>>
代码实现集合嵌套之ArrayList嵌套ArrayList
查看>>
Cookie原理
查看>>
Django之查询总结
查看>>