博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SkRefCnt
阅读量:7105 次
发布时间:2019-06-28

本文共 916 字,大约阅读时间需要 3 分钟。

 
class SK_API SkRefCnt : SkNoncopyable {public:    SkRefCnt() : fRefCnt(1) {}    virtual ~SkRefCnt() { SkASSERT(fRefCnt == 1); }    int32_t getRefCnt() const { return fRefCnt; }    void ref() const ...    void unref() const ...private:    mutable int32_t fRefCnt;};

SkNoncopyable

       ∟ SkRefCnt

以SkRefCnt为基类的对象,可以被多个对象共用(be shared by multiple objects)

当一个新的对象要引用SkRefCnt对象的时候,会调用SkRefCnt对象的ref(),当这个对象

释放它引用的SkRefCnt对象的时候,会调用它的unref(),当一个SkRefCnt对象的引用计数

在调用unref()后是0 的时候,就会调用它的析构函数。

在一个SkRefCnt对象的引用计数大于1的时候调用析构函数是错误的。

(也就是,在一个SkRefCnt对象的引用计数大于1的时候,局部SkRefCnt变量生命周期结束和主动调用delete,都是错误的)

 

类SkRefCnt的唯一成员变量是fRefCnt,也就是引用计数。

构造函数会将fRefCnt初始化为1,也就是这时候SkRefCnt没有被其他对象引用,但他的引用计数也已经是1,

所以在实际使用的时候,要多调用一次子类对象的unref(),以平衡引用计数,即:引用计数应该与SkRefCnt对象被引用次数相等。

当引用计数是1的时候,调用unref()会删除SkRefCnt对象,

(在unref函数体中,当fRefCnt被减1前等于1的时候,会将fRefCnt赋值为1,析构函数需要判断fRefCnt为1)

 

ezhong的博客园:

转载于:https://www.cnblogs.com/ezhong/archive/2011/11/29/2267858.html

你可能感兴趣的文章
基于python的web应用(一)
查看>>
什么是SEM
查看>>
Citrix Licensing Help
查看>>
究极!ThinkPHP 3.2.2 框架源码逐行分析(一)
查看>>
linux学习(2)--指令
查看>>
Dubbo基础篇_02_Zookeeper注册中心安装测试
查看>>
mysql慢查询日志
查看>>
sed 常用命令总结
查看>>
unity中经常用到的语句(1)
查看>>
Ubuntu 18.04下可视文件管理器Midnight Commander的安装使用
查看>>
sqoop内部结构
查看>>
MySQL5.7 切不要"乱射" --transaction-write-set-extraction=MURMUR32
查看>>
ip tcp udp首部
查看>>
C#中文件操作类FileUtil
查看>>
前端知识点
查看>>
安装并配置基于虚拟用户的vsftpd
查看>>
Activity间用Intent和Bundle传递参数
查看>>
【C1】scala入门
查看>>
http请求状态码和请求信息的含义
查看>>
关于假设检验
查看>>