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的博客园: