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

posts - 297,  comments - 15,  trackbacks - 0
使用情景:當類對象被 shared_ptr 管理時,需要在類自己定義的函數里把當前類對象作為參數傳給其他函數時,這時需要傳遞一個 shared_ptr ,否則就不能保持 shared_ptr 管理這個類對象的語義(因為有一個 raw pointer 指向這個類對象,而 shared_ptr 對類對象的這個引用沒有計數,很有可能 shared_ptr 已經把類對象資源釋放了,而那個調用函數還在使用類對象——顯然,這肯定會產生錯誤)。
很好奇這個模板類的實現。
先看看怎么使用:
對一個類 A ,當我們希望使用 shared_ptr 來管理其類對象時,而且需要在自己定義的函數里把類對象 shared_ptr (為什么不用普通指針,當我們使用智能指針管理資源時,必須統一使用智能指針,而不能在某些地方使用智能指針某些地方使用 raw pointer ,否則不能保持智能指針的語義,從而產生各種錯誤)傳給其他函數時,可以讓類 A 從 enable_shared_from_this 繼承:
class A : public boost::enable_shared_from_this<A> {
};
然后在類 A 中需要傳遞類對象本身 shared_ptr 的地方使用 shared_from_this 函數來獲得指向自身的 shared_ptr 。
一個非常有代表性的例子:
另《Beyond the C++ Standard Library》 shared_ptr 節也有很簡單明了的例子。
實現原理:
首先要考慮的是:在類對象本身當中不能存儲類對象本身的 shared_ptr ,否則類對象 shared_ptr 永遠也不會為0了,從而這些資源永遠不會釋放,除非程序結束。
其次:類對象肯定是外部函數通過某種機制分配的,而且一經分配立即交給 shared_ptr 管理(再次強調一遍:給 shared_ptr 管理的資源必須在分配時交給 shared_ptr ),而且以后凡是需要共享使用類對象的地方必須使用這個 shared_ptr 當作右值來構造產生或者拷貝產生另一個 shared_ptr 從而達到共享使用的目的。
有了以上兩點的限制,要實現我們的目標(即在類對象內部使用類對象的 shared_ptr )有以下兩種方案:
1、類對象的外部 shared_ptr 作為函數參數傳給類的需要引用類對象自身的函數——顯然,這種方法很丑陋,而且并不是所有的情況都可行(如在外部 shared_ptr 不可見的作用域中就不行);
2、類對象自身存儲某種信息,在需要自身 shared_ptr 時來產生一個臨時的 shared_ptr 。
顯然,第2種方法更優雅(對于用戶來說),關鍵是信息怎么存儲?
對了, weak_ptr !
實際上, boost 中就是這樣實現的。
但現在的問題是:何時初始化這個 weak_ptr ?因為類對象生成時還沒有生成相應的用來管理這個對象的 shared_ptr 。
boost 1.39.0 中是這樣實現的:
首先生成類 A :會依次調用 enable_shared_from_this 的構造函數(定義為 protected ),以及類 A 的構造函數。在調用 enable_shared_from_this 的構造函數時,會初始化定義在 enable_shared_from_this 中的 weak_ptr (調用其默認構造函數),這時這個 weak_ptr 是無效的(或者說不指向任何對象)。
接著:外部程序會把指向類 A 對象的指針作為初始化參數來初始化一個 shared_ptr 。
現在來看看 shared_ptr 是如何初始化的, shared_ptr 定義了如下構造函數:
template<class Y>
    explicit shared_ptr( Y * p ): px( p ), pn( p ) 
    {
        boost::detail::sp_enable_shared_from_this( this, p, p );
    }
里面調用了  boost::detail::sp_enable_shared_from_this :
template< class X, class Y, class T >
 inline void sp_enable_shared_from_this( boost::shared_ptr<X> const * ppx,
 Y const * py, boost::enable_shared_from_this< T > const * pe )
{
    if( pe != 0 )
    {
        pe->_internal_accept_owner( ppx, const_cast< Y* >( py ) );
    }
}
里面又調用了 enable_shared_from_this 的 _internal_accept_owner :
template<class X, class Y> void _internal_accept_owner( shared_ptr<X> const * ppx, Y * py ) const
    {
        if( weak_this_.expired() )
        {
            weak_this_ = shared_ptr<T>( *ppx, py );
        }
    }
而在這里對 enable_shared_from_this 的成員 weak_ptr 進行拷貝賦值,使得整個 weak_ptr 作為類對象  shared_ptr 的一個觀察者。
這時,當類對象本身需要自身的 shared_ptr 時,就可以從這個 weak_ptr 來生成一個了。
posted on 2012-05-20 15:37 chatler 閱讀(640) 評論(0)  編輯 收藏 引用 所屬分類: GP_STL
<2010年1月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            99精品国产在热久久婷婷| 亚洲成人在线免费| 欧美在线国产精品| 亚洲午夜久久久久久久久电影院 | 亚洲日韩中文字幕在线播放| 亚洲午夜久久久久久尤物| 中国av一区| 午夜电影亚洲| 久久久久国内| 欧美成人69av| 亚洲精品中文字幕在线| 亚洲系列中文字幕| 久久精品国产在热久久| 欧美福利一区二区三区| 欧美色图五月天| 国产日韩专区| 亚洲人成人99网站| 亚洲午夜精品久久| 久久久久久久综合日本| 国产伊人精品| 91久久精品网| 亚洲欧美日韩国产另类专区| 久久久噜久噜久久综合| 91久久精品国产91久久性色| 在线综合亚洲欧美在线视频| 久久狠狠婷婷| 欧美日韩一区在线观看| 国产真实乱偷精品视频免| 乱人伦精品视频在线观看| 欧美日韩国产三区| 韩国亚洲精品| 亚洲欧美激情一区| 亚洲大片在线| 午夜久久一区| 欧美日韩在线播放一区| 原创国产精品91| 午夜精品久久久久久久久| 免费不卡在线视频| 亚洲香蕉网站| 欧美日本韩国一区二区三区| 韩国在线一区| 欧美一区二区三区男人的天堂| 欧美大秀在线观看| 欧美一区二区三区在线| 国产精品老牛| 亚洲午夜激情网站| 日韩视频在线播放| 欧美高清视频| 亚洲激情av在线| 你懂的成人av| 久久免费99精品久久久久久| 国产日韩欧美综合| 午夜一区不卡| 亚洲一区在线观看视频 | 欧美1区2区视频| 欧美一级大片在线观看| 欧美日韩性生活视频| 亚洲美女尤物影院| 亚洲第一免费播放区| 久久精品国产在热久久| 国产人妖伪娘一区91| 亚洲视频免费在线观看| 欧美成人官网二区| 蜜臀久久99精品久久久久久9| 国产午夜精品久久久久久免费视| 一本一本久久a久久精品牛牛影视| 麻豆免费精品视频| 欧美一区二区三区免费看| 欧美性大战久久久久| 亚洲美女中文字幕| 欧美激情1区2区3区| 久久精品色图| 伊人久久大香线| 在线观看亚洲精品视频| 男人天堂欧美日韩| 久久精品免费| 久久九九精品| 国产精品自在线| 亚洲一区二区在线免费观看视频 | 国产精品久久久久久久久久免费看 | 亚洲欧美激情一区| 国产精品成人播放| 一区二区三区色| 亚洲欧洲精品一区二区三区不卡| 久久这里只有| 91久久在线视频| 亚洲国产日韩欧美在线图片| 久久蜜桃精品| 亚洲黄色av| 亚洲欧洲日本mm| 欧美日韩一区成人| 最新国产成人av网站网址麻豆| 久久美女性网| 亚洲欧美日韩另类| 国产精品日韩久久久| 久久精品国产亚洲aⅴ| 亚洲精品久久嫩草网站秘色| 国产农村妇女毛片精品久久麻豆 | 久久精品国产亚洲一区二区三区| 小辣椒精品导航| 一区二区三区在线免费视频 | 久久夜色精品亚洲噜噜国产mv | 一区二区高清视频| 欧美图区在线视频| 一区二区免费在线视频| 亚洲精品视频免费| 国产精品久久久久9999吃药| 久久精品理论片| 欧美阿v一级看视频| 99国产精品久久久| 亚洲综合另类| 91久久国产综合久久蜜月精品| 91久久久久久国产精品| 欧美色视频在线| 久久久久国色av免费看影院| 欧美成人午夜剧场免费观看| 亚洲女ⅴideoshd黑人| 久久福利视频导航| 一本久道综合久久精品| 欧美一级播放| 正在播放欧美一区| 欧美~级网站不卡| 午夜日韩在线观看| 免费人成精品欧美精品| 午夜免费在线观看精品视频| 亚洲国产精品成人综合| 久久伊人精品天天| 久久久久久久久蜜桃| 欧美日韩国产免费| 欧美激情亚洲一区| 国产一区二区三区电影在线观看| 亚洲黄一区二区| 精品1区2区3区4区| 亚洲免费视频成人| 午夜免费在线观看精品视频| 欧美激情综合亚洲一二区| 久久精品中文字幕一区| 免费人成网站在线观看欧美高清| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美亚日韩国产aⅴ精品中极品| 欧美成人网在线| 狠狠久久亚洲欧美| 亚洲欧美日韩精品久久亚洲区| 一区二区三区.www| 欧美国产一区二区在线观看| 亚洲欧美日韩精品| 国产精品美女在线| 亚洲美女黄网| 日韩视频在线观看免费| 老司机67194精品线观看| 久久综合狠狠综合久久综青草 | 欧美日韩综合| 亚洲国产精品一区二区第一页| 国产免费一区二区三区香蕉精| 一区二区三区欧美日韩| 在线中文字幕一区| 国产精品jizz在线观看美国 | 久久伊人精品天天| 国产一区欧美| 欧美在线观看你懂的| 久久久精品一区| 激情综合网址| 麻豆9191精品国产| 久久精品视频亚洲| 亚洲级视频在线观看免费1级| 麻豆freexxxx性91精品| 欧美国产精品劲爆| 亚洲三级视频| 欧美精品一区在线播放| 亚洲精选在线观看| 先锋a资源在线看亚洲| 亚洲美女精品一区| 亚洲激情网址| 国产精品一香蕉国产线看观看| 欧美一区二区大片| 欧美 日韩 国产 一区| 亚洲狼人精品一区二区三区| 欧美久久久久| 亚洲一区二区三区欧美 | 欧美揉bbbbb揉bbbbb| 中国成人黄色视屏| 久久国产精品久久久久久| 国产一区二区欧美| 麻豆freexxxx性91精品| 亚洲欧洲一区二区在线播放| 99在线热播精品免费| 亚洲免费影院| 久久久水蜜桃av免费网站| 亚洲国产裸拍裸体视频在线观看乱了| 欧美成人福利视频| 欧美刺激性大交免费视频| 午夜视频在线观看一区二区三区| 国产欧美一区二区视频| 美女视频黄 久久| 亚洲私人影院| 亚洲国产精品久久久久秋霞蜜臀| 欧美一级播放| 国内精品久久久久伊人av| 国产精品videosex极品| 久久乐国产精品|