青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

martin

thinking

常用鏈接

統計

software

最新評論

智能指針的代碼實例

前段時間,寫了一點關于智能指針的東西,有讀者反映沒有代碼比較難懂.現給出源碼,并稍微加以解釋.

智能指針類用到的基類的定義:
template<typename T>
class HandleBase
{
public:

    typedef T element_type;

    T* get() const
    {
        return _ptr;
    }
   
   //重載->操作符,返回所指對象的指針.

    T* operator->() const
    {
        if(!_ptr)
        {
            //
            // We don't throw directly NullHandleException here to
            // keep the code size of this method to a minimun (the
            // assembly code for throwing an exception is much bigger
            // than just a function call). This maximises the chances
            // of inlining by compiler optimization.
            //
            throwNullHandleException(__FILE__, __LINE__);
        }

        return _ptr;
    }

//  通過智能指針獲取所指對象的引用.

    T& operator*() const
    {
        if(!_ptr)
        {
            //
            // We don't throw directly NullHandleException here to
            // keep the code size of this method to a minimun (the
            // assembly code for throwing an exception is much bigger
            // than just a function call). This maximises the chances
            // of inlining by compiler optimization.
            //
            throwNullHandleException(__FILE__, __LINE__);
        }

        return *_ptr;
    }

    operator bool() const
    {
        return _ptr ? true : false;
    }

    void swap(HandleBase& other)
    {
        std::swap(_ptr, other._ptr);
    }

    T* _ptr;

private:

    void throwNullHandleException(const char *, int) const;
};

......


// 智能指針類定義

template<typename T>
class Handle : public HandleBase<T>
{
public:

    Handle(T* p = 0)               //智能指針的構造函數
    {
        this->_ptr = p;

        if(this->_ptr)
        {
            this->_ptr->__incRef();         //在構造函數中增加所指對象的引用計數
        }
    }

    template<typename Y>                  //拷貝構造函數
    Handle(const Handle<Y>& r)
    {
        this->_ptr = r._ptr;

        if(this->_ptr)
        {
            this->_ptr->__incRef();   //在構造函數中增加所指對象的引用計數
        }
    }

    Handle(const Handle& r)         //拷貝構造函數
    {
        this->_ptr = r._ptr;

        if(this->_ptr)
        {
            this->_ptr->__incRef();    //在構造函數中增加所指對象的引用計數
        }
    }

    ~Handle()
    {
        if(this->_ptr)
        {
            this->_ptr->__decRef();      //在析構函數中減少所指對象的引用計數
        }
    }

// 重載=操作符, 要注意所有權 (即,對原實例的處理).

    Handle& operator=(T* p)         
    {
        if(this->_ptr != p)
        {
            if(p)
            {
                p->__incRef();      //增加新指對象的引用計數
            }

            T* ptr = this->_ptr;
            this->_ptr = p;

            if(ptr)
            {
                ptr->__decRef();   //減少原來所指對象的引用計數
            }
        }
        return *this;
    }

    template<typename Y>
    Handle& operator=(const Handle<Y>& r)
    {
        if(this->_ptr != r._ptr)
        {
            if(r._ptr)
            {
                r._ptr->__incRef();   //增加新指對象的引用計數
            }

            T* ptr = this->_ptr;
            this->_ptr = r._ptr;

            if(ptr)
            {
                ptr->__decRef();      //減少原來所指對象的引用計數
            }
        }
        return *this;
    }

    Handle& operator=(const Handle& r)
    {
        if(this->_ptr != r._ptr)
        {
            if(r._ptr)
            {
                r._ptr->__incRef();            //增加新指對象的引用計數
            }

            T* ptr = this->_ptr;
            this->_ptr = r._ptr;

            if(ptr)
            {
                ptr->__decRef();            //減少原來所指對象的引用計數
            }
        }
        return *this;
    }

 跟智能指針配合使用的對象.要能夠跟指針智能配合使用,這些對象應該是從下列類的派生類的實例.
class SimpleShared
{
public:

    SimpleShared();
    SimpleShared(const SimpleShared&);

    virtual ~SimpleShared()
    {
    }

    SimpleShared& operator=(const SimpleShared&)
    {
        return *this;
    }

    void __incRef()
    {
        assert(_ref >= 0);
        ++_ref;
    }

    void __decRef()
    {
        assert(_ref > 0);
        if(--_ref == 0)               // 如果引用計數為0,則摧毀對象本身.
        {
            if(!_noDelete)
            {
                _noDelete = true;
                delete this;
            }
        }
    }

    int __getRef() const
    {
        return _ref;
    }

    void __setNoDelete(bool b)
    {
        _noDelete = b;
    }

private:

    int _ref;
    bool _noDelete;
};

class Shared
{
public:

    Shared();
    Shared(const Shared&);

    virtual ~Shared()
    {
    }

    Shared& operator=(const Shared&)
    {
        return *this;
    }

    virtual void __incRef();
    virtual void __decRef();
    virtual int __getRef() const;
    virtual void __setNoDelete(bool);

protected:

#if defined(_WIN32)
    LONG _ref;
#elif defined(ICE_HAS_ATOMIC_FUNCTIONS)
    volatile int _ref;
#else
    int _ref;
    Mutex _mutex;
#endif
    bool _noDelete;
};

posted on 2009-03-09 16:07 martin_yahoo 閱讀(2251) 評論(6)  編輯 收藏 引用

評論

# re: 智能指針的代碼實例 2009-03-09 17:18 eXile

ICE中的實現吧,這個并沒有解決循環引用的問題。所以他還有一個GCShared   回復  更多評論   

# re: 智能指針的代碼實例[未登錄] 2009-03-09 18:01 martin_yahoo

u r right. These souce code is abstracted from ICE.  回復  更多評論   

# re: 智能指針的代碼實例 2009-03-11 09:45 夢在天涯

mark  回復  更多評論   

# re: 智能指針的代碼實例 2009-05-05 09:02 brightcoder

一個句柄類而已  回復  更多評論   

# re: 智能指針的代碼實例 2013-04-26 23:58 WWW

這是哪個開源項目中的啊?  回復  更多評論   

# re: 智能指針的代碼實例 2013-06-08 17:13 tb

模仿寫一下  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩视频第一页| 欧美岛国激情| 国产精品久久久久久亚洲调教| av成人免费在线观看| 亚洲国产精品美女| 久久久亚洲精品一区二区三区| 国产免费观看久久| 久久精品中文字幕免费mv| 欧美一级理论片| 一区在线视频| 久久久水蜜桃av免费网站| 亚洲欧美韩国| 国产午夜精品在线观看| 久久精品人人爽| 亚洲伊人一本大道中文字幕| 欧美日韩视频在线| 性18欧美另类| 久久婷婷麻豆| 日韩一区二区精品在线观看| 在线视频亚洲一区| 国产乱码精品一区二区三区五月婷 | 国语自产精品视频在线看8查询8 | 久久久视频精品| 久久精品国产99国产精品| 国外成人免费视频| 欧美 日韩 国产一区二区在线视频| 国产欧美一区二区视频| 亚洲字幕在线观看| 久久久久久午夜| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美亚洲自偷自偷| 美脚丝袜一区二区三区在线观看| 久久福利精品| 亚洲免费观看在线观看| 亚洲欧美资源在线| 国产一区三区三区| 欧美国产精品久久| 国产精品欧美久久| 另类天堂av| 国产精品v片在线观看不卡| 噜噜噜躁狠狠躁狠狠精品视频| 欧美精品在线免费播放| 欧美亚洲综合另类| 欧美激情精品久久久久久蜜臀 | 亚洲欧洲精品一区二区精品久久久| 亚洲片区在线| 尤物在线精品| 亚洲资源在线观看| 日韩视频精品在线| 久久九九热免费视频| 亚洲欧美日韩久久精品| 免费成人av| 久久视频在线免费观看| 国产精品麻豆成人av电影艾秋| 欧美韩日一区二区| 欧美视频第二页| 亚洲精品乱码视频| 亚洲国产毛片完整版| 校园春色综合网| 先锋a资源在线看亚洲| 欧美日本一区二区三区| 久久免费偷拍视频| 国产精品一区二区三区四区五区| 亚洲欧洲精品一区二区精品久久久 | 一本综合久久| 亚洲免费av电影| 欧美成年人网| 欧美激情二区三区| 亚洲尤物在线| 亚洲日本久久| 久久夜色精品国产| 午夜视频一区| 国产精品午夜在线观看| 中文网丁香综合网| 一本色道88久久加勒比精品| 欧美成人免费在线| 亚洲国产日本| 一本色道久久综合| 欧美视频一区二区三区…| 亚洲狼人综合| 最新日韩欧美| 一区二区免费在线播放| 欧美日韩免费观看一区三区| 夜夜精品视频| 亚洲欧美日韩另类| 国产一区二区三区在线观看视频 | 欧美电影美腿模特1979在线看| 亚洲国产精品久久久久秋霞影院 | 亚洲尤物视频在线| 亚洲一区二区在线观看视频| 国产精品久久久久久五月尺| 亚洲欧美激情四射在线日| 久久人人爽人人| 亚洲国产精品激情在线观看| 午夜免费日韩视频| 国产日韩精品在线| 久久嫩草精品久久久久| 欧美激情久久久| 亚洲一区精品视频| 狠狠狠色丁香婷婷综合久久五月| 欧美伊人久久大香线蕉综合69| 久久一日本道色综合久久| 亚洲第一区在线| 欧美日韩dvd在线观看| 亚洲视频日本| 久久综合一区二区三区| 狠狠干综合网| 美日韩精品免费| 亚洲小说春色综合另类电影| 麻豆精品91| 亚洲无人区一区| 黑丝一区二区三区| 欧美日韩国产一区精品一区| 午夜综合激情| 亚洲精品国产日韩| 久久精品国产久精国产一老狼| 亚洲人成在线免费观看| 国产精品一区亚洲| 奶水喷射视频一区| 亚洲在线电影| 亚洲激情偷拍| 免费观看亚洲视频大全| 一区二区国产在线观看| 韩国女主播一区| 欧美成人按摩| 欧美中文字幕视频在线观看| 亚洲精品黄色| 久热精品视频在线观看| 亚洲永久字幕| 亚洲经典三级| 国产自产在线视频一区| 欧美午夜电影一区| 久久嫩草精品久久久精品一| 亚洲一二三级电影| 亚洲精品免费在线| 欧美高潮视频| 狂野欧美激情性xxxx欧美| 欧美一区成人| 亚洲淫性视频| 在线亚洲+欧美+日本专区| 亚洲国产精品成人精品| 狠狠干综合网| 国产午夜精品久久久| 欧美激情一区二区三区| 久久久综合免费视频| 一区二区三区.www| 国产精品自在在线| 欧美日韩直播| 国产精品久久久久久一区二区三区| 久久久亚洲成人| 尤物网精品视频| 国产一区二区三区不卡在线观看| 国产精品久久久久秋霞鲁丝| 欧美日本一区二区三区| 欧美巨乳在线| 欧美日韩国产欧美日美国产精品| 欧美在线黄色| 久久久久久久91| 久久婷婷成人综合色| 免费成人毛片| 欧美精品色网| 欧美视频精品在线| 欧美黄免费看| 国产精品嫩草久久久久| 国产乱码精品一区二区三区忘忧草| 欧美午夜激情视频| 国产精品久久久一区二区三区 | 欧美怡红院视频一区二区三区| 亚洲性夜色噜噜噜7777| 亚洲欧美日韩在线综合| 欧美一区中文字幕| 美日韩精品视频| 欧美二区乱c少妇| 亚洲国产欧美日韩精品| 9久re热视频在线精品| 欧美一区二区三区播放老司机| 免费成人毛片| 国产欧美一区二区精品仙草咪| 亚洲高清在线播放| 亚洲中无吗在线| 欧美激情一区二区三区不卡| 亚洲一区二区三区乱码aⅴ| 噜噜噜久久亚洲精品国产品小说| 国产精品大片免费观看| 在线不卡中文字幕| 午夜精品在线观看| 亚洲激情在线播放| 久久九九久精品国产免费直播| 欧美天天综合网| 亚洲日本视频| 久久亚洲精品网站| 宅男精品视频| 欧美另类videos死尸| 亚洲国产欧美不卡在线观看| 欧美在线不卡| 亚洲天堂av在线免费| 欧美激情一区二区三区蜜桃视频| 伊人久久大香线蕉av超碰演员| 欧美在线免费视频| 一本色道久久综合精品竹菊|