[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。
循环引用示例
- #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
destroying CCycleRef
创建的CCycleRef对象已被释放。
转载于:https://www.cnblogs.com/zhangzhang/archive/2013/03/04/2942637.html
[zz] C++智能指针循环引用解决相关推荐
- 智能指针循环引用问题
智能指针循环引用 循环引用简单来说就是:两个对象互相使用一个shared_ptr成员变量指向对方,这会造成循环引用.导致引用计数失效,内存无法释放. #include <iostream> ...
- 智能指针循环引用——你真的懂了吗?
相信不少同学都在面试中都被问到过c++智能指针的问题,接踵而至的必定是循环引用了,而我每次的答案都是一招鲜:因为它们都在互相等待对方先释放,所以造成内存泄漏.面试官很满意,我也很满意. 但是为啥要等到 ...
- SpringBoot:循环引用解决方式
SpringBoot:循环引用解决方式 1 前言 SpringBoot启动时提示循环引用: Relying upon circular references is discouraged and th ...
- 【C++】智能指针简述(五):解决循环引用的weak_ptr
总结一下前文内容: 1.智能指针通过RAII方法来管理指针:构造对象时,完成资源初始化;析构对象时,对资源进行清理及汕尾. 2.auto_ptr,通过"转移所有权"来防止析构一块内 ...
- VTK修炼之道80:VTK开发基础_智能指针与引用计数
1.引用计数 VTK经过多年的开发与维护,已经形成了一套稳定的框架和开发规则.因此,了解这些规则和框架是定制VTK类的基础,这其中用到了大量面向对象的设计模式,例如对象工程模式.观察者/命令模式:还有 ...
- c++智能指针与引用计数
一. 引用计数 先写一个简单的学生类 #include<iostream> #include <string.h> using namespace std;class stud ...
- C++(9)--裸指针、智能指针、引用
指针 1.裸指针的基本概念 1.1 裸指针的声明*/初始化& 1.2 操作裸指针--间接运算符* 1.3 裸指针使用 demo--指向一个简单变量 1.4 空指针--nullptr 1.5 特 ...
- python循环引用解决 cannot import partially initialize
文章目录 1. 问题 2. 程序结构 3. 健康的引用关系 1. 问题 在python项目中,通常我们要将功能划分为多个文件, 可能出现一些,各模块需要一些公共的值.实例,同时相互存在循环引用的问题. ...
- 智能指针shared_ptr引用计数工作原理
引用计数原理 shared_ptr的实现是这样的: shared_ptr模板类有一个__shared_count类型的成员_M_refcount来处理引用计数的问题.__shared_count也是 ...
最新文章
- 如何获取URL中的参数
- model.fit以及model.fit_generator区别及用法
- 爱是谋杀:读徐小斌的《别人》
- 装mysql最后一步没响应_解决MySQL安装到最后一步未响应的三种方法
- 今天一看,自己发的文章原来这么多了。openeim
- 再见2019,拥抱2020
- 判断相等_为什么不建议你用a.equals(b)判断对象相等
- JQuery - 提交表单
- RVC使用指南(一)-基本配置
- 微服务升级_SpringCloud Alibaba工作笔记0009---阿里云部署微服务_在内网不同机器上_报错_注册中心找不到对应的机器_遇到java.net.UnknownHostExceptio
- 18.XML CDATA
- jsp java ldquo_添加jsp · yayaangel/java201521123103 - Gitee.com
- windows7安装cuda10.2
- SVN客户端安装使用教程
- 微信小程序做出 物流签收信息(步骤条) 源码
- axios和ajax怎么读,axios, ajax和fetch的比较
- 3个步骤+1个模型,原来「数据分析」才是「增长黑客」的核心技能!
- 【hadoop生态之Hive】Hive的DML数据操纵语言【笔记+代码】
- 程序媛的2013总结以及2014展望
- html+php教程,HTML入门教程
热门文章
- JZOJ 3806. 【NOIP2014模拟8.24】小X 的道路修建
- python打印二进制内容,Python字节不打印二进制
- emmap erlang_erlang的map基本使用
- 转]一个计算机专业学生几年的Java编程经验汇总
- Codeforces 1326F Wise Men (容斥原理、状压 DP、划分数)
- Codeforces 1106F Lunar New Year and a Recursive Sequence (线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...
- python绘制指数函数图像及性质_指数函数图像及其性质正式版
- 2012自动登录服务器,配置Windows自动登录 - Windows Server | Microsoft Docs
- redis延迟队列 如何确保成功消费_千万级延时任务队列如何实现,看美图开源的-LMSTFY...
- python gpu加速 显卡_PyTorch-GPU加速实例