`
lovnet
  • 浏览: 6704968 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
参考文章: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

循环引用示例

#include "stdafx.h"
#include <string>
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>

using namespace std;
using namespace boost;

class CCycleRef
{
public:
    ~CCycleRef()
    {
        cout <<"destroying CCycleRef"<<endl;
    }

public:
    shared_ptr<CCycleRef> selfRef;
};

void CycleRefTest()
{
    shared_ptr<CCycleRef> cyclRef(new CCycleRef());
    cyclRef->selfRef = cyclRef;

    cout<<"reference count:"<<cyclRef.use_count()<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    CycleRefTest();
    
    return 0;
}

运行结果:

reference count:2

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


循环引用解决

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

class CCycleRef
{
public:
    ~CCycleRef()
    {
        cout <<"destroying CCycleRef"<<endl;
    }

public:
    weak_ptr<CCycleRef> selfRef;
};

运行结果
reference count:1
destroyingCCycleRef

创建的CCycleRef对象已被释放。

分享到:
评论

相关推荐

    C++智能指针循环引用问题分析.pdf

    C++智能指针循环引⽤问题分析 C++11中引⼊了三种智能指针,分别是shared_ptr、weak_ptr和unique_ptr 智能指针的作⽤ 智能指针可以帮助我们管理动态分配的堆内存,减少内存泄漏的可能性 ⼿动管理堆内存有引起内存泄漏...

    关于c++ 智能指针及 循环引用的问题

    下面小编就为大家带来一篇关于c++ 智能指针及 循环引用的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    c++智能指针

    c++ weak_ptr在解决shared ptr中出现的循环引用的左右

    C++中的循环引用

    虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧

    C++11智能指针之weak_ptr详解

    如题,我们今天要讲的是 C++11 引入的三种智能指针中的:weak_ptr。 在学习 weak_ptr 之前最好对 shared_ptr 有所了解。如果你还不知道 shared_ptr 是何物,可以看看另一篇文章: 【C++11新特性】 C++11智能指针之...

    C++ 标准程序库.pdf

    而今C++11标准则以其人之道还治其身,吸收了Java/C#里的诸多市场成熟养分,如①基于范围for循环、②类移动构造与委托能力扩充、③类初始化方式平易化、④智能指针(垃圾回收能力)、⑤Lambda、⑥可变参数模板、⑦...

    深入理解C++11:C++11新特性解析与应用

    1555.1.1 枚举:分门别类与数值的名字 1555.1.2 有缺陷的枚举类型 1565.1.3 强类型枚举以及C++11对原有枚举类型的扩展 1605.2 堆内存管理:智能指针与垃圾回收 1635.2.1 显式内存管理 1635.2.2 C++11的智能指针 ...

    Visual C++ 2005入门经典.part08.rar (整理并添加所有书签)

    7.10 类对象的指针和引用 7.10.1 类对象的指针 7.10.2 类对象的引用 7.11 C++/CLI编程 7.11.1 定义数值类类型 7.11.2 定义引用类类型 7.11.3 类属性 7.11.4 initonly字段 7.11.5 静态构造函数 7.12 小结 7.13 练习 ...

    Visual C++ 2005入门经典.part04.rar (整理并添加所有书签)

    7.10 类对象的指针和引用 7.10.1 类对象的指针 7.10.2 类对象的引用 7.11 C++/CLI编程 7.11.1 定义数值类类型 7.11.2 定义引用类类型 7.11.3 类属性 7.11.4 initonly字段 7.11.5 静态构造函数 7.12 小结 7.13 练习 ...

    Visual C++ 2005入门经典.part05.rar (整理并添加所有书签)

    7.10 类对象的指针和引用 7.10.1 类对象的指针 7.10.2 类对象的引用 7.11 C++/CLI编程 7.11.1 定义数值类类型 7.11.2 定义引用类类型 7.11.3 类属性 7.11.4 initonly字段 7.11.5 静态构造函数 7.12 小结 7.13 练习 ...

    C++ Primer第四版【中文高清扫描版】.pdf

    13.5.1 定义智能指针类 421 13.5.2 定义值型类 425 小结 427 术语 427 第14章 重载操作符与转换 429 14.1 重载操作符的定义 430 14.2 输入和输出操作符 435 14.2.1 输出操作符的重载 435 14.2.2 输入操作符&gt;&gt;的重载...

    visualC++2010入门经典源代码

    7.10 类对象的指针和引用 334 7.10.1 类对象的指针 334 7.10.2 类对象的引用 337 7.11 c++/cli编程 338 7.11.1 定义值类类型 339 7.11.2 定义引用类类型 344 7.11.3 定义引用类类型的复制构造函数 346 7.11.4...

    [Visual.C++.2010入门经典(第5版)].Ivor.Horton.part1

    7.10 类对象的指针和引用 334 7.10.1 类对象的指针 334 7.10.2 类对象的引用 337 7.11 c++/cli编程 338 7.11.1 定义值类类型 339 7.11.2 定义引用类类型 344 7.11.3 定义引用类类型的复制构造函数 346 7.11.4 类属性...

    C++编程规范101条规则、准则与最佳实践PDF.rar

    使用显式的RAII和智能指针 24 编程风格 27 第14条 宁要编译时和连接时错误,也不要运行时错误 28 第15条 积极使用const 30 第16条 避免使用宏 32 第17条 避免使用“魔数” 34 第18条 尽可能局部...

    Visual C++ 2005入门经典.part07.rar (整理并添加所有书签)

    7.10 类对象的指针和引用 7.10.1 类对象的指针 7.10.2 类对象的引用 7.11 C++/CLI编程 7.11.1 定义数值类类型 7.11.2 定义引用类类型 7.11.3 类属性 7.11.4 initonly字段 7.11.5 静态构造函数 7.12 小结 7.13 练习 ...

    Visual C++ 2005入门经典.part09.rar (整理并添加所有书签)

    7.10 类对象的指针和引用 7.10.1 类对象的指针 7.10.2 类对象的引用 7.11 C++/CLI编程 7.11.1 定义数值类类型 7.11.2 定义引用类类型 7.11.3 类属性 7.11.4 initonly字段 7.11.5 静态构造函数 7.12 小结 7.13 练习 ...

Global site tag (gtag.js) - Google Analytics