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

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>
            亚洲风情亚aⅴ在线发布| 欧美日韩国产一区二区三区地区| 国产精品一区二区你懂得| 在线综合亚洲欧美在线视频| 亚洲精品一区二区三区蜜桃久| 欧美日韩午夜| 亚洲欧美另类在线观看| 性欧美超级视频| 海角社区69精品视频| 亚洲国产91| 欧美精品一区在线| 性欧美videos另类喷潮| 久久精品最新地址| 夜久久久久久| 亚洲免费一级电影| 亚洲国产另类久久精品| 9久re热视频在线精品| 国产女精品视频网站免费| 模特精品在线| 国产精品九九| 欧美成在线视频| 欧美性生交xxxxx久久久| 久久久夜精品| 欧美色图天堂网| 猛干欧美女孩| 国产精品激情av在线播放| 蜜桃av一区| 国产精品欧美日韩| 亚洲第一狼人社区| 国产亚洲欧美一区二区| 亚洲日本一区二区| 黄色国产精品| 中文一区在线| 亚洲精品你懂的| 久久精品一区二区三区不卡牛牛| 欧美精品一区二区三区四区| 一区二区三区在线视频观看| 日韩午夜在线观看视频| 韩日精品视频| 亚洲愉拍自拍另类高清精品| 亚洲精品婷婷| 久久综合网络一区二区| 久久se精品一区精品二区| 欧美日韩免费在线| 欧美黑人多人双交| 精品电影在线观看| 香蕉av777xxx色综合一区| 亚洲永久精品国产| 欧美人与性禽动交情品| 亚洲成人在线视频播放 | 欧美激情一区在线| 美女诱惑一区| 红桃视频国产精品| 欧美亚洲网站| 久久高清免费观看| 国产欧美综合一区二区三区| 亚洲婷婷国产精品电影人久久| 亚洲最快最全在线视频| 老**午夜毛片一区二区三区| 久久久久久久综合色一本| 国产日韩欧美不卡| 亚洲欧美亚洲| 久久精品视频在线观看| 国产亚洲美州欧州综合国| 午夜一区在线| 久久久噜噜噜久久人人看| 国内精品一区二区| 久久米奇亚洲| 亚洲电影观看| 在线亚洲国产精品网站| 欧美视频四区| 亚洲欧美日韩国产一区二区三区 | 亚洲激情av| 欧美黄网免费在线观看| 亚洲精品一区二区在线观看| 在线视频你懂得一区| 欧美视频在线免费| 亚洲欧美国产一区二区三区| 久久免费偷拍视频| 亚洲二区三区四区| 欧美日韩大片一区二区三区| 一本色道88久久加勒比精品| 欧美一级精品大片| 在线播放国产一区中文字幕剧情欧美 | 欧美a级在线| 夜夜嗨av色一区二区不卡| 国产精品高清网站| 久久国产天堂福利天堂| 亚洲国产精品久久久久婷婷老年 | 午夜精品久久久久久久99水蜜桃| 欧美一区2区三区4区公司二百| 国产日韩在线一区| 麻豆国产精品777777在线| 亚洲免费观看视频| 久久亚洲国产成人| 99热这里只有精品8| 国产欧美日韩免费| 欧美承认网站| 欧美一级精品大片| 亚洲激情电影中文字幕| 欧美亚洲一区二区三区| 亚洲黄页视频免费观看| 国产精品一二一区| 母乳一区在线观看| 亚洲欧美日韩国产中文| 亚洲国产欧美国产综合一区| 久久成人18免费观看| 亚洲精品在线二区| 好吊色欧美一区二区三区四区| 欧美欧美天天天天操| 久久久国产精品一区二区三区| 99视频有精品| 欧美黑人一区二区三区| 久久久久久久波多野高潮日日| 一区二区电影免费观看| 亚洲第一毛片| 狠狠色狠狠色综合人人| 国产精品自拍三区| 国产精品99免费看 | 精品1区2区3区4区| 国产精品女人久久久久久| 欧美激情视频网站| 看片网站欧美日韩| 久久精品首页| 欧美一区二区三区成人| 亚洲免费一在线| 亚洲视频一区二区| 亚洲精选成人| 亚洲精品欧美一区二区三区| 亚洲第一在线综合在线| 另类成人小视频在线| 久久国产欧美精品| 欧美在线一二三| 欧美在线啊v| 久久不见久久见免费视频1| 香蕉尹人综合在线观看| 西西人体一区二区| 午夜一级久久| 欧美在线播放高清精品| 欧美有码在线观看视频| 欧美在线观看一二区| 欧美在线999| 久久久久国色av免费看影院| 久久久久久久精| 理论片一区二区在线| 嫩模写真一区二区三区三州| 欧美成人一区二免费视频软件| 欧美成人精品三级在线观看| 欧美高清视频一区二区| 亚洲激情视频在线播放| 亚洲日本成人网| 在线视频你懂得一区| 亚洲欧美怡红院| 久久精品夜色噜噜亚洲aⅴ| 久久最新视频| 欧美精品在线观看91| 欧美系列精品| 国产午夜亚洲精品羞羞网站| 红桃视频亚洲| 99re热这里只有精品视频| 亚洲一区不卡| 久久精品一区中文字幕| 激情av一区| 欧美亚洲第一区| 国产一区二区三区久久久久久久久| 韩国在线一区| 日韩亚洲精品视频| 亚洲欧美中文另类| 可以免费看不卡的av网站| 亚洲国产美女精品久久久久∴| 日韩视频不卡| 久久av二区| 欧美人妖在线观看| 国产亚洲精久久久久久| 亚洲日本欧美天堂| 性欧美暴力猛交69hd| 欧美成人xxx| 亚洲一区二区视频在线| 老牛国产精品一区的观看方式| 欧美日韩国产探花| 韩国成人福利片在线播放| 日韩视频免费大全中文字幕| 欧美一区二区三区视频免费播放 | 久久婷婷色综合| 亚洲精品小视频| 久久精品视频在线看| 欧美日韩视频一区二区三区| 国内精品视频一区| 亚洲调教视频在线观看| 免费在线视频一区| 亚洲综合三区| 欧美精品九九| 影音先锋日韩资源| 欧美一区二区私人影院日本| 亚洲区欧美区| 久久全球大尺度高清视频| 国产精品亚洲不卡a| 一本久道综合久久精品| 女女同性精品视频| 午夜欧美不卡精品aaaaa|