为什么要用引用计数?
场景:代码里X是一个非常重要的资源,模块A,B,C都有对其指针的引用,那么为了不出现内存泄露,常规的代码我们要怎么写?
1. A 模块用完X时,需要检查B,C是否还在引用X,如果B,C有一个在用,那么X只要删除掉对A的引用就可以了,
如果B,C对A都已经没有引用了,那么A需要删除对X的引用时,要同时清除掉X。
2.同样B,C在用完X时,也要重复做1里面的事情。
这样,代码将会多了许多的逻辑判断,同时模块B,C还需要对模块A提供查询是否在引用X的接口。
可以不这么恶心吗?
思考:能否A在释放X前,不需要知道是谁在引用X,只要知道有多少人在引用X?
回答:是的,如果只有我用X,那么我就直接删除,如果还有其他人用,我就什么都不管,只要去除掉对X的引用就可以了。 情况就会变的好一些。
那么如何做到能知道资源的引用次数那?
这就需要对每一个资源X的都有一个的计数,这个计数是和资源X的生命周期息息相关的。
那么如何来管理这个计数?怎么能在有模块引用资源X的时候,计数++,模块释放资源X的时候计数--那?
这个就有一定难度了,引用的方式会有很多种,比如 A = X; A.push_back(X); A[100] = X; ...
当然我们可以在代码里的每一处增加和释放资源引用的地方,都加上代码count++,count--;但这亦然很麻烦,维护成本很高。
如何简单些?
能否把对资源的引用和释放,看成是对一个类的拷贝和销毁来完成? 弄一个代理类,里面封装好计数和资源X。
把所有对资源X的引用都理解成对代理类的引用,对代理类的引用都理解成对代理类的拷贝,对代理的释放就是销毁代理类。
这样我们只需要在代理类的拷贝函数里count++ , 代理类的析构做count--就好了。
如果代理类的资源引用计数count 减为0,就看成所有人都释放了对资源X的引用,这时由代理类来完成对资源的销毁。
这样下来,事情就简化了很多。 所以学会抽象是多么重要的一件事情。
一点code:
class RefPtr { size count; X * ptr; } class Proxy { RefPtr* ptr; };
1 Proxy里面需要重载=, 拷贝构造
2 Proxy需要提供访问ptr的接口
3 Proxy需要在拷贝的地方增加计数,析构的时候判断是否删除ptr
--- ko,这里就写一点思路,具体代码就略过了。
相关推荐
C++引用计数设计与分析(解决垃圾回收问题).docx
引用计数的实现,c++源码实现,工程可编译,利用模板实现的,项目中可直接使用。部分代码是从webkit中引用计数直接引用过来的
COM入门学习实例,c++程序实现引用计数易于理解,动态绑定相关
引用也叫做别名,为一个变量起一个名字,二者代表同一地址,也代表同一变量。 int a=1; int &b=a;//b是a的一个变量,初始化为a 声明一个变量时必须对其进行初始化。 声明一个变量的引用后,在函数执行期间,该引用...
C++实现 带引用计数的智能指针 VS2008工程文件
C++ 对象计数 实例计数
c++引用的事例,适合c++入门以及从事多年参考
计数排序 用C++实现 简单易懂 欢迎下载
深入浅出C++引用,总结引用基础知识及其应用,帮助很好的理解引用。
C++ 引用的作用和用法,C++ 引用的作用和用法
C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++
C++引用&和指针在作为形参时的区别 int n; int &m = n; 在C++中,多了一个C语言没有的引用声明符&,如上,m就是n的引用,简单的说m就是n的别名,两者在内存中占同样的位置,不对m开辟新的内存空间,对m的任何操作,...
详细分析了指针与引用的区别,适合初学者了解
关于图像处理 灰度处理 二值处理 细胞计数的代码
设计一个函数,将两个浮点数传入,然后通过引用把其和、差、积传出。 函数原型如下:void Math(float a,float b,float &sum,float &sub,float &pro); 输入两个浮点数 输出两个浮点数之和
c++之十引用和拷贝构造函数c++之十引用和拷贝构造函数c++之十引用和拷贝构造函数c++之十引用和拷贝构造函数
MATLAB 图像识别物体计数,将图像中的物体识别别出来,并进行计数,SIMULINK编程与开发方法。
基于C++开发了一个求解变幅载荷转化到横幅载荷的程序
科学计数法向一般数字的转化,数组实现,以及浮点数实现法
c++中按引用传递是一个比较让人疑惑的知识点,本文介绍c++按引用传递的相关知识