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

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
<2012年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用鏈接

留言簿(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>
            女主播福利一区| 欧美一区2区三区4区公司二百| 一区一区视频| 久久久久久穴| 久久精品30| 亚洲精品乱码久久久久久久久| 久久久精品视频成人| 久久久久久一区二区| 亚洲激情视频| 中日韩美女免费视频网址在线观看 | 极品少妇一区二区三区精品视频| 久久久av毛片精品| 久久乐国产精品| 日韩视频在线播放| 亚洲一二区在线| 国内外成人免费激情在线视频网站| 乱中年女人伦av一区二区| 你懂的一区二区| 亚洲综合日本| 久久综合福利| 亚洲欧美综合| 免费在线成人av| 欧美一级专区| 另类天堂av| 欧美一区二区三区日韩视频| 久久亚洲私人国产精品va媚药 | 国产欧美日本一区二区三区| 欧美成人午夜激情视频| 国产精品国产三级国产普通话99| 久久精品1区| 欧美日韩视频专区在线播放| 久久亚洲二区| 国产精品久久久一区麻豆最新章节| 另类图片国产| 国产欧美日韩高清| 亚洲精选91| 亚洲国产精品一区在线观看不卡| 亚洲校园激情| 一区二区三区四区五区视频 | 国产精品区二区三区日本| 欧美高清视频一二三区| 国产日韩欧美夫妻视频在线观看| 亚洲精品一区二区网址 | 欧美色道久久88综合亚洲精品| 久久香蕉国产线看观看av| 国产精品久久久久久影视 | 久久久久青草大香线综合精品| 欧美日韩免费一区二区三区| 欧美h视频在线| 国产亚洲精品aa| 亚洲欧美在线观看| 午夜国产精品视频| 欧美午夜大胆人体| 亚洲精品在线观| 日韩视频在线一区二区| 噜噜噜噜噜久久久久久91| 久热精品视频在线观看| 国产午夜精品久久久| 亚洲欧美日韩综合一区| 亚洲欧美日韩视频一区| 国产精品成人v| 一区二区三区精品视频在线观看| 夜夜嗨av一区二区三区中文字幕 | 欧美成人中文字幕| 激情欧美一区| 亚洲国产经典视频| 韩日精品视频| 久久精品91| 免费久久99精品国产| 在线观看欧美一区| 蜜月aⅴ免费一区二区三区| 免费观看亚洲视频大全| **欧美日韩vr在线| 欧美ed2k| 一区二区精品在线| 欧美一区二区三区在线免费观看| 国产欧美日韩亚州综合| 欧美在线亚洲一区| 欧美成在线视频| 日韩亚洲欧美成人| 国产精品日韩在线播放| 欧美一区二区免费视频| 美女日韩欧美| 一区二区三区高清| 国产嫩草影院久久久久 | 91久久夜色精品国产九色| 一区二区欧美在线观看| 国产精品网曝门| 久久精品五月| 亚洲精品视频在线观看免费| 欧美夜福利tv在线| 在线免费观看日本一区| 欧美日韩精品欧美日韩精品| 午夜激情亚洲| 亚洲国产成人在线播放| 亚洲永久精品国产| 亚洲国产精品女人久久久| 国产精品免费久久久久久| 欧美在线视频二区| 日韩视频二区| 久久中文久久字幕| 亚洲一区二区三区精品视频| 精品999在线观看| 欧美日韩一区二区三区在线视频 | 欧美日本国产一区| 欧美呦呦网站| 这里只有精品电影| 欧美激情视频一区二区三区不卡| 亚洲综合国产| 亚洲精品国产精品国产自| 国产伦精品一区二区三区免费迷| 免费观看日韩av| 欧美一区=区| 中文国产一区| 亚洲国产精品成人综合色在线婷婷| 午夜日韩视频| 亚洲天堂成人在线观看| 亚洲福利在线视频| 国产综合亚洲精品一区二| 欧美日韩亚洲一区三区| 免费看黄裸体一级大秀欧美| 欧美一二三视频| 亚洲专区国产精品| aⅴ色国产欧美| 亚洲黄色视屏| 亚洲大胆人体在线| 欧美超级免费视 在线| 久久不射电影网| 亚洲欧美美女| 亚洲综合清纯丝袜自拍| 亚洲视频在线二区| 99精品欧美一区| 亚洲精品欧美在线| 亚洲黄网站在线观看| 欧美激情精品久久久久久| 牛牛精品成人免费视频| 亚洲欧美在线一区二区| 亚洲私人影吧| 国产精品99久久久久久人| 99国内精品久久久久久久软件| 亚洲国产小视频在线观看| 亚洲成色www8888| 亚洲国产一区二区三区a毛片| 在线看欧美视频| 亚洲国产精品专区久久| 亚洲乱码国产乱码精品精| 亚洲精品乱码久久久久久按摩观| 亚洲人成人一区二区三区| 亚洲人成小说网站色在线| 91久久精品一区二区三区| 亚洲精品欧洲| 亚洲欧美成人一区二区在线电影| 亚洲综合色自拍一区| 午夜在线一区二区| 久久久高清一区二区三区| 久久综合一区二区| 欧美电影在线观看完整版| 亚洲国产精品嫩草影院| 亚洲精品乱码久久久久久久久 | 午夜精品久久久久99热蜜桃导演| 亚洲欧美日本另类| 久久嫩草精品久久久精品一| 免费在线欧美黄色| 欧美视频在线观看免费| 国产精品人人做人人爽| 黄色欧美成人| 亚洲免费高清| 久久av老司机精品网站导航| 女仆av观看一区| 亚洲裸体视频| 久久av一区二区三区亚洲| 欧美国产视频在线| 国产精品久久午夜| 亚洲第一网站| 亚洲欧美日韩成人| 欧美承认网站| 亚洲欧美韩国| 欧美精品一区二区三| 国产欧美在线看| 亚洲另类视频| 久久频这里精品99香蕉| 亚洲日韩中文字幕在线播放| 午夜精品久久久久久久久久久久久| 蜜桃av噜噜一区| 国产欧美日本| 亚洲午夜久久久久久久久电影院| 久久欧美中文字幕| 亚洲在线播放| 欧美日韩国产片| 136国产福利精品导航网址应用 | 午夜精品久久久久久久男人的天堂 | 久久综合狠狠综合久久综合88| 欧美午夜美女看片| 在线欧美一区| 久久精品一本| 亚洲一区二三| 欧美色播在线播放| 日韩视频一区二区在线观看| 美女图片一区二区| 亚洲综合电影|