zoukankan      html  css  js  c++  java
  • [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对象已被释放。

  • 相关阅读:
    .net软件开发工程师面试题
    html笔记
    好用软件
    谷歌插件
    vue笔记
    js笔记
    数组去重
    css全局样式
    css笔记
    vscod插件
  • 原文地址:https://www.cnblogs.com/zhangzhang/p/2942637.html
Copyright © 2011-2022 走看看