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

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
<2009年12月>
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>
            亚洲自拍高清| 久久免费的精品国产v∧| 欧美国产第一页| 亚洲欧洲综合| 亚洲高清激情| 欧美福利视频| 一本色道久久综合亚洲精品按摩 | 国产精品自拍网站| 亚洲欧美综合v| 亚洲欧美日韩精品综合在线观看| 国产精品欧美在线| 久久国产精品一区二区| 欧美一区午夜精品| 激情国产一区| 亚洲激情啪啪| 国产精品国产三级国产普通话三级| 亚洲专区国产精品| 久久精品99无色码中文字幕| 亚洲国产成人久久综合| 亚洲二区视频| 国产精品入口66mio| 久久久久9999亚洲精品| 麻豆成人在线观看| 亚洲综合大片69999| 久久精品亚洲国产奇米99| 最新国产成人av网站网址麻豆| 亚洲成在人线av| 亚洲一二三四区| 亚洲欧美久久久久一区二区三区| 国模叶桐国产精品一区| 亚洲国产另类久久久精品极度| 国产精品户外野外| 欧美激情导航| 国产欧美日韩视频| 亚洲国产清纯| 国产专区精品视频| 亚洲精美视频| 激情文学综合丁香| 一区二区三区四区五区视频| 尤物九九久久国产精品的特点| 亚洲欧洲日本专区| 黄色一区二区三区四区| 9国产精品视频| 在线色欧美三级视频| 亚洲香蕉网站| 亚洲伦理在线观看| 久久久水蜜桃| 欧美在线观看www| 欧美日韩成人综合在线一区二区| 另类激情亚洲| 国内精品久久久久伊人av| 999亚洲国产精| 亚洲全部视频| 久久久噜噜噜久久中文字幕色伊伊| 亚洲一区二区黄| 欧美激情中文字幕乱码免费| 久久资源av| 国产区日韩欧美| 这里只有精品电影| 99国内精品| 女生裸体视频一区二区三区| 欧美大色视频| 欧美日韩一二三四五区| 欧美成人免费在线观看| 国产精品区二区三区日本| 亚洲久久成人| 日韩午夜av电影| 女人色偷偷aa久久天堂| 免费欧美电影| 在线精品一区| 久久天天狠狠| 欧美成人精品在线| 影院欧美亚洲| 久久综合网络一区二区| 久久亚洲图片| 亚洲电影欧美电影有声小说| 久久国产一区二区| 美女精品在线| 亚洲第一福利在线观看| 美女主播精品视频一二三四| 欧美激情第4页| 日韩一级二级三级| 欧美日韩亚洲网| 洋洋av久久久久久久一区| 亚洲一区二区精品在线| 国产精品乱子乱xxxx| 羞羞漫画18久久大片| 久久视频一区| 亚洲国产成人一区| 欧美日韩hd| 亚洲女性裸体视频| 美女福利精品视频| aⅴ色国产欧美| 国产精品视频免费一区| 久久www成人_看片免费不卡| 麻豆精品传媒视频| 99视频在线观看一区三区| 欧美亚一区二区| 欧美中文字幕在线播放| 欧美韩日一区| 亚洲免费在线视频| 国产综合久久久久久鬼色| 久久这里只有| 一本久道久久综合狠狠爱| 久久av资源网站| 亚洲国产精品久久久久久女王| 欧美激情精品| 欧美在线观看视频| 亚洲欧洲免费视频| 久久免费偷拍视频| 一本色道久久综合亚洲精品不| 国产麻豆精品视频| 欧美大片va欧美在线播放| 亚洲免费一级电影| 亚洲国产精品成人| 久久久久久一区二区三区| 亚洲裸体视频| 在线观看精品一区| 国产精品萝li| 欧美日韩成人在线播放| 久久精品视频导航| 亚洲一级影院| 亚洲精品日韩激情在线电影| 麻豆成人在线| 欧美一区中文字幕| 亚洲视频www| 亚洲国产精品女人久久久| 国产伦精品一区二区三区高清| 欧美激情视频一区二区三区在线播放| 欧美一区二区三区免费观看 | 日韩午夜av电影| 尤物九九久久国产精品的分类| 国产精品毛片a∨一区二区三区| 欧美成人午夜免费视在线看片| 欧美一级大片在线观看| 中日韩美女免费视频网站在线观看| 亚洲国产va精品久久久不卡综合| 久久久免费精品| 欧美一区激情| 亚洲欧美一区二区原创| 亚洲视频在线一区| 妖精视频成人观看www| 亚洲日本成人女熟在线观看| 依依成人综合视频| 在线观看国产一区二区| 黄色亚洲免费| 精品va天堂亚洲国产| 狠狠久久婷婷| 韩国福利一区| 激情亚洲成人| 一色屋精品视频在线看| 国产一区二区看久久| 国产一区二区三区在线观看免费视频 | 欧美国产日韩xxxxx| 欧美成人三级在线| 免费观看一区| 亚洲国产福利在线| 亚洲日韩欧美视频| 99热这里只有精品8| 99精品国产一区二区青青牛奶| 日韩视频在线你懂得| 亚洲视频精品| 欧美一级理论性理论a| 久久国产精品一区二区三区| 久久大逼视频| 蜜桃av一区二区三区| 欧美成人亚洲| 欧美午夜a级限制福利片| 国产精品一区二区在线观看网站| 国产精品亚洲аv天堂网| 国产亚洲永久域名| 亚洲电影在线播放| 99精品福利视频| 亚洲在线一区二区| 久久久xxx| 亚洲精品国产视频| 亚洲欧美成人| 免费成人激情视频| 国产精品久久看| 一区二区三区自拍| 这里只有精品视频| 久久久久久69| 亚洲人成绝费网站色www| 亚洲网友自拍| 快播亚洲色图| 欧美性久久久| 亚洲第一精品福利| 亚洲欧美日韩精品久久奇米色影视| 久久精品国产精品亚洲精品| 亚洲电影有码| 欧美一级电影久久| 欧美另类一区二区三区| 国产性做久久久久久| 99精品久久久| 久久综合激情| 亚洲在线观看视频网站| 欧美激情第1页| 黑人巨大精品欧美一区二区小视频| 99精品国产热久久91蜜凸| 老司机精品视频网站|