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/

  • 相关阅读:
    DateTimeHelper
    Check F5 refresh submit post back repeatly
    GZip Compress SoapExtension
    WebBrowser 高级扩展 js扩展 js订阅C#事件
    DataSet GZip/Deflate Serializer
    Socket/Stream Data Helper
    历年评书出版一览表(1955~1994)
    c#检测字节流编码
    Execute SQL Server Store Procedure C# ADO.Net Wrapper Code Generator
    Directory File Disk Searcher
  • 原文地址:https://www.cnblogs.com/ezhong/p/2267858.html
Copyright © 2011-2022 走看看