[zz] C++智能指针循环引用解决

转载自: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

循环引用示例

  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类。

  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/p/2942637.html