c++引证计数的实质ITeye - 众发娱乐

c++引证计数的实质ITeye

2019年03月13日09时47分02秒 | 作者: 夜南 | 标签: 引证,计数,资源 | 浏览: 1051

为什么要用引证计数? 

       场景:代码里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,这儿就写一点思路,详细代码就略过了。

        

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表众发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章