zoukankan      html  css  js  c++  java
  • SkRefCnt

    
    
    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/

  • 相关阅读:
    Web前端学习笔记之BootStrap
    js 闭包解决方案
    函数节流简要解析
    js 观察者模式
    arguments解析
    js 职责链模式简要介绍
    js 工厂模式简要介绍
    jsonp跨域总结
    算法复杂度
    正则表达式的$
  • 原文地址:https://www.cnblogs.com/ezhong/p/2267858.html
Copyright © 2011-2022 走看看