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

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 閱讀(639) 評論(0)  編輯 收藏 引用 所屬分類: GP_STL
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(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>
            久久国产直播| 亚洲精品国产欧美| 午夜精品一区二区三区四区 | 久久久综合精品| 精久久久久久久久久久| 欧美波霸影院| 欧美三级在线视频| 欧美在线视频导航| 女女同性精品视频| 中文在线资源观看网站视频免费不卡| 日韩香蕉视频| 国内揄拍国内精品久久 | 一区二区高清在线| 亚洲专区一区二区三区| 国模私拍一区二区三区| 亚洲福利在线看| 国产精品色婷婷| 美女亚洲精品| 欧美三级电影精品| 久久亚洲电影| 欧美午夜精品伦理| 免费日韩av电影| 国产精品色一区二区三区| 免费久久99精品国产自| 欧美日韩在线播| 美日韩在线观看| 国产精品大片| 亚洲国产成人在线视频| 国产精品一区二区你懂得 | 久久亚裔精品欧美| 亚洲无亚洲人成网站77777| 欧美在线一区二区三区| 国产精品99久久久久久白浆小说 | 欧美xart系列高清| 欧美一区激情视频在线观看| 牛夜精品久久久久久久99黑人 | 性欧美超级视频| 欧美精品一区二| 看欧美日韩国产| 国产精品成人久久久久| 欧美激情1区2区3区| 国产一区二区丝袜高跟鞋图片| 亚洲人成网在线播放| 黄色国产精品一区二区三区| 亚洲一区二区三区免费视频| 日韩亚洲一区二区| 久久精品久久综合| 久久成人亚洲| 国产农村妇女精品一二区| 亚洲精品久久久久久久久久久久| 亚洲电影免费观看高清| 性做久久久久久| 久久国产黑丝| 国产女主播一区二区| 在线视频日韩精品| 亚洲一区二区三| 国产精品xxxav免费视频| 日韩视频在线播放| 一区二区免费在线播放| 欧美日本中文字幕| 亚洲精品五月天| 一区二区三区国产精品| 欧美精品在线网站| 亚洲免费电影在线| 亚洲一区精品电影| 国产精品久久久久9999高清| 亚洲视频精选在线| 小辣椒精品导航| 国产亚洲欧美激情| 久久国产日韩欧美| 欧美大片免费| 一区二区三区毛片| 国产精品国产一区二区| 亚洲在线视频观看| 久久婷婷蜜乳一本欲蜜臀| 国外视频精品毛片| 久久午夜电影| 亚洲精品社区| 亚洲欧美资源在线| 国内精品亚洲| 欧美成人有码| 亚洲深夜福利视频| 久久精品在线免费观看| 在线观看91久久久久久| 欧美成人精品三级在线观看| 日韩视频在线一区二区| 欧美一区二区三区在线| 黄网站免费久久| 久久综合99re88久久爱| 久久精品国产在热久久| 制服丝袜激情欧洲亚洲| 久久综合一区二区三区| 亚洲午夜激情| 欧美视频免费在线| 欧美国产欧美综合| 亚洲理论电影网| 欧美日韩精品二区第二页| 亚洲精品综合精品自拍| 亚洲性感美女99在线| 国产精品成人国产乱一区| 久久国产主播| 亚洲国产一区二区三区a毛片| 在线成人中文字幕| 欧美另类一区| 久久亚洲一区二区| 中文在线不卡视频| 久久精品夜色噜噜亚洲a∨ | 欧美日韩一区二区视频在线观看 | 性久久久久久久久久久久| 欧美高清免费| 欧美专区中文字幕| 亚洲狼人综合| 亚洲电影网站| 国产精品国产三级国产普通话蜜臀| 欧美一区2区视频在线观看| 亚洲国产精品久久| 久久人91精品久久久久久不卡 | 国内外成人免费激情在线视频网站| 欧美激情第3页| 欧美在线视频导航| 亚洲视频 欧洲视频| 欧美激情 亚洲a∨综合| 欧美一级视频精品观看| 99精品欧美一区二区三区综合在线 | 尤物yw午夜国产精品视频明星| 欧美日本不卡视频| 老司机一区二区三区| 亚洲欧美中文字幕| 一区二区三区欧美视频| 亚洲国产婷婷香蕉久久久久久| 久久久蜜桃一区二区人| 欧美一级片一区| 午夜日韩福利| 欧美一级午夜免费电影| 亚洲午夜精品久久久久久浪潮| 99视频日韩| 亚洲精品一区二区三区樱花| 狠狠久久亚洲欧美| 狠狠色狠狠色综合日日tαg | 国产一区二区三区免费观看| 国产日韩欧美一二三区| 国产精品亚洲综合一区在线观看| 国产精品爱啪在线线免费观看| 欧美日韩精品高清| 欧美日韩一区精品| 国产精品久久久久久久久搜平片 | 欧美激情影音先锋| 欧美在现视频| 久久久久免费观看| 蘑菇福利视频一区播放| 欧美成人午夜视频| 欧美日本免费一区二区三区| 欧美区在线播放| 欧美网站在线观看| 国产日韩欧美一区二区| 好男人免费精品视频| 亚洲国产毛片完整版 | 国产婷婷色一区二区三区| 国产欧美一区二区三区国产幕精品 | 欧美裸体一区二区三区| 欧美日韩免费在线| 国产精品日本精品| 永久免费毛片在线播放不卡| 91久久中文字幕| 亚洲特色特黄| 先锋影音久久| 麻豆精品精华液| 亚洲人成网站在线观看播放| 一区二区三区日韩| 欧美专区18| 欧美日韩一区视频| 狠狠噜噜久久| 这里只有精品电影| 久久久亚洲综合| 亚洲人永久免费| 午夜精品在线观看| 欧美成人在线免费观看| 国产精品久久久久久久久久三级| 红桃视频一区| 亚洲小视频在线观看| 久久米奇亚洲| 亚洲一级黄色| 欧美国产一区二区| 国产日本精品| 亚洲视频综合在线| 农村妇女精品| 小黄鸭精品密入口导航| 欧美激情综合五月色丁香| 国产一区免费视频| 亚洲一区二区三区免费视频| 欧美aa在线视频| 午夜精品久久久久99热蜜桃导演| 蜜桃av综合| 国内精品嫩模av私拍在线观看| 亚洲视频一区二区在线观看| 免费在线成人av| 欧美一区二区在线看| 国产精品jizz在线观看美国| 亚洲欧洲一区二区三区| 久久久av网站|