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的博客园:http://www.cnblogs.com/ezhong/