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

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
<2009年11月>
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>
            欧美激情亚洲视频| 久久久久国产精品一区二区| 欧美肥婆在线| 亚洲免费成人av电影| 亚洲精品在线观| 欧美先锋影音| 久久av在线| 久久一二三区| 99精品欧美一区二区蜜桃免费| 91久久久在线| 欧美视频手机在线| 午夜综合激情| 久久午夜视频| 在线中文字幕不卡| 午夜精品视频网站| 亚洲黄色在线看| 99re8这里有精品热视频免费 | 一区二区三区免费在线观看| 国产精品嫩草99av在线| 久久精品最新地址| 欧美成人精品高清在线播放| 亚洲影院色无极综合| 新67194成人永久网站| 销魂美女一区二区三区视频在线| 国产综合色精品一区二区三区| 欧美顶级艳妇交换群宴| 国产精品久久777777毛茸茸| 久久精品国产欧美激情| 欧美va亚洲va香蕉在线| 亚洲欧美日韩精品久久亚洲区 | 国产精品大片| 欧美成人一区二区三区在线观看| 欧美视频在线观看免费网址| 久久久成人精品| 欧美日韩国产成人在线| 久久在线播放| 国产精品视频最多的网站| 亚洲电影下载| 狠狠入ady亚洲精品经典电影| 亚洲片在线资源| 亚洲黄色片网站| 久久久久99精品国产片| 亚洲一品av免费观看| 免费毛片一区二区三区久久久| 欧美一区二区免费视频| 欧美日本一区二区高清播放视频| 老色鬼久久亚洲一区二区| 国产精品网站一区| 日韩一级精品视频在线观看| 在线观看一区二区视频| 性色av一区二区三区在线观看| 亚洲欧洲三级| 麻豆乱码国产一区二区三区| 久久一区欧美| 狠狠色狠狠色综合日日五| 亚洲欧美激情诱惑| 亚洲综合成人在线| 欧美午夜精品久久久| 亚洲精品免费观看| 亚洲伦理自拍| 欧美精品一卡| 亚洲精品一区二区三区福利| 亚洲看片网站| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久久久久一区| 国产精品亚洲а∨天堂免在线| 一本大道久久a久久综合婷婷| 亚洲伦理一区| 欧美三级视频在线| 中文精品一区二区三区| 午夜精品福利视频| 国产精品人人做人人爽| 亚洲欧美经典视频| 久久亚洲免费| 亚洲三级观看| 欧美日韩亚洲免费| 亚洲一区影音先锋| 午夜精品国产| 国内精品久久久久久 | 欧美高清一区二区| 亚洲一区免费| 国产精品自拍网站| 久久九九免费| 亚洲精品乱码久久久久久蜜桃麻豆| 99精品视频免费观看| 欧美视频日韩| 久久精品夜色噜噜亚洲aⅴ| 免费视频亚洲| 亚洲一级二级在线| 国产女人18毛片水18精品| 久久精品理论片| 亚洲欧洲精品一区二区精品久久久| 亚洲天堂视频在线观看| 国产精品亚洲人在线观看| 久久久精品国产免大香伊| 亚洲国产精品v| 香港成人在线视频| 亚洲电影在线| 国产精品丝袜xxxxxxx| 久久香蕉国产线看观看网| 日韩亚洲欧美一区| 久久久久久亚洲综合影院红桃| 亚洲乱码精品一二三四区日韩在线| 国产精品视频午夜| 牛牛影视久久网| 欧美一区二区三区在线| 91久久久久久| 两个人的视频www国产精品| av成人动漫| 在线观看成人一级片| 国产精品www994| 免费成人高清视频| 亚洲欧美日韩国产综合精品二区| 欧美成人免费小视频| 亚洲女女女同性video| 亚洲国产精品ⅴa在线观看 | 一区三区视频| 国产精品久久久久aaaa樱花| 蜜臀a∨国产成人精品| 亚洲欧美中文日韩在线| 99在线|亚洲一区二区| 欧美成人一区二区在线| 久久久国产精品一区二区中文| 在线午夜精品| av72成人在线| 日韩一区二区免费看| 亚洲国产第一| 狠狠狠色丁香婷婷综合久久五月| 国产精品嫩草99a| 国产精品jizz在线观看美国| 欧美精品成人一区二区在线观看| 久久久之久亚州精品露出| 性欧美videos另类喷潮| 亚洲一区二区欧美| 一区二区三区国产| 99re视频这里只有精品| 亚洲肉体裸体xxxx137| 欧美激情一区二区三区不卡| 欧美风情在线| 亚洲电影在线观看| 亚洲高清资源| 亚洲人成欧美中文字幕| 亚洲人成在线观看一区二区| 亚洲大片在线| 亚洲欧洲视频| 亚洲免费av电影| 99亚洲伊人久久精品影院红桃| 日韩一区二区精品葵司在线| 99精品国产在热久久婷婷| 日韩手机在线导航| 亚洲午夜高清视频| 亚洲自拍偷拍麻豆| 欧美一区二区三区电影在线观看| 羞羞漫画18久久大片| 久久久久成人精品免费播放动漫| 美女视频网站黄色亚洲| 免费在线国产精品| 亚洲高清在线播放| 99xxxx成人网| 亚洲综合999| 久久精品国产欧美亚洲人人爽| 久久久午夜精品| 欧美美女操人视频| 国产精品久久久久久久久| 国产日本欧美一区二区三区在线| 国内伊人久久久久久网站视频| 亚洲福利视频二区| 亚洲手机在线| 久久久久久精| 最近中文字幕mv在线一区二区三区四区| 亚洲人www| 午夜精品亚洲一区二区三区嫩草| 开心色5月久久精品| 欧美日韩一区二区视频在线观看| 国产热re99久久6国产精品| 一区在线免费| 亚洲视频日本| 蜜臀av性久久久久蜜臀aⅴ四虎 | 先锋影音一区二区三区| 美日韩精品免费观看视频| 亚洲精品一区中文| 久久aⅴ国产紧身牛仔裤| 欧美国产精品一区| 国产一区二区三区奇米久涩 | 亚洲第一页自拍| 亚洲综合三区| 欧美激情一区二区三区在线视频| 午夜精品国产更新| 欧美精品不卡| 亚洲国产成人91精品| 欧美中文字幕精品| 日韩视频永久免费观看| 麻豆91精品91久久久的内涵| 国产精品国产福利国产秒拍| 亚洲国产天堂久久综合| 久久精品欧洲| 亚洲一区二区欧美日韩| 欧美日本免费一区二区三区| 在线看无码的免费网站| 欧美一区二区三区另类|