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/

  • 相关阅读:
    219. Contains Duplicate II
    189. Rotate Array
    169. Majority Element
    122. Best Time to Buy and Sell Stock II
    121. Best Time to Buy and Sell Stock
    119. Pascal's Triangle II
    118. Pascal's Triangle
    88. Merge Sorted Array
    53. Maximum Subarray
    CodeForces 359D Pair of Numbers (暴力)
  • 原文地址:https://www.cnblogs.com/ezhong/p/2267858.html
Copyright © 2011-2022 走看看