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

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 閱讀(644) 評論(0)  編輯 收藏 引用 所屬分類: GP_STL
<2012年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(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>
            国产原创一区二区| 樱花yy私人影院亚洲| 一区二区三区四区在线| 亚洲国产欧美久久| 欧美激情视频一区二区三区在线播放| 激情五月婷婷综合| 男女激情久久| 欧美精品亚洲二区| 亚洲自拍16p| 欧美一区二区三区免费视频| 激情小说另类小说亚洲欧美| 欧美99久久| 欧美日韩免费观看一区=区三区| 亚洲视频在线免费观看| 午夜一区在线| 亚洲精品久久久久久下一站| 亚洲美女av黄| 国产亚洲激情在线| 欧美黄色一区二区| 国产精品极品美女粉嫩高清在线 | 久久精品国产亚洲aⅴ| 在线成人www免费观看视频| 亚洲电影免费在线观看| 欧美午夜精品一区| 久久影音先锋| 欧美日韩一区二区三区免费| 久久精品视频免费| 欧美激情视频给我| 久久九九有精品国产23| 欧美精品免费视频| 久久久999精品| 欧美日韩国产一区二区| 久久精品综合| 欧美日韩免费一区二区三区视频| 欧美在线中文字幕| 欧美激情精品久久久久久蜜臀 | 亚洲国产精品传媒在线观看| a4yy欧美一区二区三区| 伊人夜夜躁av伊人久久| 中文亚洲免费| 亚洲六月丁香色婷婷综合久久| 亚洲欧美电影在线观看| 99国产精品国产精品久久| 性做久久久久久免费观看欧美| 日韩手机在线导航| 久久久水蜜桃av免费网站| 亚洲欧美在线播放| 欧美人与禽猛交乱配| 女主播福利一区| 国产精品制服诱惑| 一区二区三区日韩精品| 亚洲精选中文字幕| 免费成年人欧美视频| 久久久久国色av免费观看性色| 国产精品国产a级| 亚洲高清在线播放| 亚洲国产精品视频| 久久亚洲欧洲| 蜜臀av国产精品久久久久| 国产午夜一区二区三区| 亚洲欧美制服另类日韩| 午夜精品福利在线观看| 国产精品久久二区| 在线视频欧美日韩| 亚洲欧美日韩在线不卡| 欧美吻胸吃奶大尺度电影| 日韩系列欧美系列| 亚洲视频成人| 国产精品美女久久久久久2018| 亚洲桃花岛网站| 亚洲免费一在线| 国产精品国产精品| 亚洲欧美激情精品一区二区| 欧美亚洲一区二区三区| 国产亚洲激情在线| 久久免费视频一区| 亚洲国产成人精品久久久国产成人一区| 一区二区三区在线看| 久久久一本精品99久久精品66| 欧美成人精品1314www| 亚洲国产欧美在线| 欧美日本国产视频| 亚洲综合丁香| 免费不卡在线观看av| 最新国产拍偷乱拍精品| 欧美日韩你懂的| 亚洲欧美久久久久一区二区三区| 久久av老司机精品网站导航| 在线播放豆国产99亚洲| 欧美国产极速在线| 亚洲小视频在线观看| 久久久精品日韩| 亚洲美女尤物影院| 国产精品久久久免费| 久久精品成人| 亚洲欧洲一区二区天堂久久| 亚洲综合日韩| 尤物yw午夜国产精品视频| 欧美成人午夜激情在线| 亚洲天堂久久| 欧美第十八页| 亚洲欧美视频在线观看| 亚洲成人影音| 国产精品免费视频观看| 美女国产一区| 亚洲欧美视频一区二区三区| 欧美黑人多人双交| 欧美一区二区精美| 亚洲欧洲日本在线| 国产欧美日韩综合| 欧美激情欧美激情在线五月| 午夜在线播放视频欧美| 91久久精品一区二区别| 久久久视频精品| 亚洲午夜未删减在线观看| 亚洲第一中文字幕| 国产欧美日韩中文字幕在线| 欧美精品一线| 久久久另类综合| 羞羞视频在线观看欧美| av不卡在线观看| 亚洲国产精品久久久久婷婷884| 久久成人精品电影| 亚洲一区三区视频在线观看| 亚洲人成7777| 亚洲国产成人精品女人久久久 | 国内精品一区二区三区| 欧美视频在线免费| 欧美国产精品专区| 久久久久久综合| 香蕉av777xxx色综合一区| 一区二区三区.www| 亚洲欧洲精品成人久久奇米网| 蜜臀va亚洲va欧美va天堂| 先锋资源久久| 欧美一区二区三区免费观看| 亚洲婷婷免费| 亚洲一区二区伦理| 这里只有精品视频在线| 亚洲免费观看高清完整版在线观看| 在线观看日韩精品| 在线观看日韩av电影| 国产一区二区欧美| 国模 一区 二区 三区| 国产日韩欧美成人| 国产一区91| 狠色狠色综合久久| 永久免费毛片在线播放不卡| 精品成人在线| 亚洲国产91色在线| 亚洲激情视频在线| 亚洲美女在线一区| 一区二区三区www| 亚洲一区bb| 欧美在线观看你懂的| 久久av一区二区| 久久久久久久999精品视频| 久久午夜电影| 欧美国产一区在线| 亚洲免费观看| 亚洲无线一线二线三线区别av| 亚洲一区二区三区四区五区黄| 午夜精品久久久久久久蜜桃app | 久久久久天天天天| 久久亚洲精品中文字幕冲田杏梨 | 亚洲一区久久久| 欧美一区二区三区四区在线观看| 欧美亚洲综合久久| 久久综合综合久久综合| 欧美日韩hd| 国产欧美视频一区二区三区| 在线成人www免费观看视频| 99这里只有精品| 欧美中文字幕视频| 欧美成人自拍| 99re视频这里只有精品| 久久激情综合| 欧美日韩一区二区在线| 国产一区二区电影在线观看 | 国产综合视频在线观看| 亚洲国产精品尤物yw在线观看| 一本久道综合久久精品| 久久国产黑丝| 亚洲精品字幕| 久久精品色图| 国产精品二区二区三区| 在线看欧美视频| 欧美亚洲在线观看| 亚洲福利小视频| 午夜视频一区在线观看| 欧美激情在线观看| 精品成人国产| 欧美一区二区三区日韩视频| 亚洲国产精品综合| 久久国产精品一区二区| 欧美午夜剧场| 一区二区三区精密机械公司 | 亚洲精品视频在线播放| 久久精品国产91精品亚洲| 亚洲伦理在线|