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

本文共 1034 字,大约阅读时间需要 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对象已被释放。

你可能感兴趣的文章
关于数据分析思路的4点心得
查看>>
加班越久故障越多,如何跳出程序员的恶性循环?
查看>>
Memcached安装与配置
查看>>
Ansible二三事
查看>>
美团数据仓库的演进
查看>>
云计算和无人机如何谈出恋爱火花?
查看>>
SAP被评为“大数据”预测分析领军企业
查看>>
联想企业网盘张跃华:让文件创造业务价值
查看>>
iOS 简单数据的读写
查看>>
记录一次蚂蚁金服前端电话面试
查看>>
RecyclerView预加载机制源码分析
查看>>
直播源码开发视频直播平台,不得不了解的流程
查看>>
Ubuntu上的pycrypto给出了编译器错误
查看>>
聊聊flink的RestClientConfiguration
查看>>
在CentOS上搭建git仓库服务器以及mac端进行克隆和提交到远程git仓库
查看>>
測試文章
查看>>
Flex很难?一文就足够了
查看>>
【BATJ面试必会】JAVA面试到底需要掌握什么?【上】
查看>>
微服务b2b b2c o2o电子商务云平台
查看>>
上手kubernetes之前,你应该知道这6件事
查看>>