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

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精品欧美| 久久9热精品视频| 欧美成人a视频| 国产精品乱码妇女bbbb| 激情婷婷亚洲| 国产精品99久久99久久久二8| 欧美一区二区三区久久精品| 蜜桃精品一区二区三区 | 久久精品国产久精国产爱| 欧美 日韩 国产一区二区在线视频| 亚洲大胆人体视频| 亚洲综合999| 女人天堂亚洲aⅴ在线观看| 欧美日韩在线播| 在线看片欧美| 久久精品成人一区二区三区蜜臀 | 夜夜爽av福利精品导航 | 久久精品主播| 99综合在线| 久久综合色综合88| 国产日韩欧美一区二区三区在线观看| 亚洲精品美女免费| 久久综合色天天久久综合图片| 狠狠色丁香久久综合频道| 亚洲黄色在线视频| 欧美在线不卡| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 在线一区亚洲| 免费成人毛片| 在线播放豆国产99亚洲| 亚洲伊人网站| 91久久在线播放| 久久久久久9999| 国产日韩欧美一区二区三区四区| 在线中文字幕日韩| 亚洲动漫精品| 久热精品在线视频| 伊人久久亚洲美女图片| 久久久久91| 亚洲一卡二卡三卡四卡五卡| 欧美天堂亚洲电影院在线观看| 亚洲欧洲三级电影| 欧美高清你懂得| 美女精品在线| 亚洲人永久免费| 欧美激情精品久久久久| 另类专区欧美制服同性| 亚洲电影免费观看高清| 免费永久网站黄欧美| 久久精品视频在线看| 国产在线观看精品一区二区三区| 欧美中文在线免费| 欧美一区二区三区免费看| 国产日韩精品入口| 久久精品国产综合精品| 久久国产精品99精品国产| 狠狠久久五月精品中文字幕| 久久久999精品免费| 久久激五月天综合精品| 在线成人www免费观看视频| 免费欧美日韩国产三级电影| 麻豆精品在线播放| 一区二区三区 在线观看视| 99精品久久| 国产一区av在线| 欧美 日韩 国产一区二区在线视频| 猛干欧美女孩| 亚洲午夜精品国产| 欧美亚洲在线播放| 伊人精品成人久久综合软件| 亚洲破处大片| 国产欧美高清| 欧美黄免费看| 欧美午夜久久| 久久一区激情| 欧美日韩免费网站| 久久久久国产精品人| 嫩草影视亚洲| 欧美有码视频| 欧美顶级少妇做爰| 久久成人国产| 亚洲欧洲日本一区二区三区| 国产精品久久久久久av下载红粉 | 久久一综合视频| 亚洲一级二级| 麻豆久久久9性大片| 亚洲欧美综合国产精品一区| 久久天天躁狠狠躁夜夜av| 亚洲午夜一二三区视频| 老鸭窝91久久精品色噜噜导演| 亚洲影音先锋| 欧美bbbxxxxx| 久久久精品国产99久久精品芒果| 欧美日韩99| 免费在线成人| 国产区亚洲区欧美区| 亚洲欧洲日本mm| 有坂深雪在线一区| 午夜免费日韩视频| 亚洲一区二区免费| 欧美国产第一页| 麻豆成人在线观看| 国产精品视频一区二区高潮| 亚洲人成网站在线播| 精品二区视频| 欧美一区二区在线免费观看 | 亚洲精品1234| 久久精品中文字幕一区二区三区| 一区二区三区欧美视频| 欧美成人精品一区二区| 免费视频久久| 伊人精品久久久久7777| 久久www成人_看片免费不卡| 午夜激情一区| 国产精品国产三级国产aⅴ9色| 91久久精品一区二区三区| 亚洲国产日韩美| 久久婷婷成人综合色| 蜜臀av国产精品久久久久| 国内精品久久久久影院色 | 久久嫩草精品久久久久| 久久久久国产一区二区三区四区| 国产精品女主播在线观看 | 亚洲国产精品va| 亚洲国产清纯| 欧美黄色视屏| 亚洲日韩欧美一区二区在线| 亚洲七七久久综合桃花剧情介绍| 久久久五月婷婷| 免费在线视频一区| 亚洲欧洲日韩综合二区| 欧美精品电影| 亚洲美女av网站| 亚洲女同性videos| 国产精品最新自拍| 欧美尤物巨大精品爽| 蜜臀久久久99精品久久久久久| 在线日本高清免费不卡| 欧美二区乱c少妇| 一本色道久久| 久久久久久久欧美精品| 老司机精品视频一区二区三区| 欧美福利小视频| 一本色道久久99精品综合| 欧美视频精品一区| 午夜精品国产精品大乳美女| 久久免费午夜影院| 亚洲精品在线观看视频| 欧美视频在线观看免费网址| 亚洲一区精品电影| 蜜桃久久精品乱码一区二区| 夜夜嗨av一区二区三区网页| 国产精品久久久久久久久免费樱桃| 午夜精品一区二区三区在线视| 裸体歌舞表演一区二区| 99riav1国产精品视频| 国产精品视频免费在线观看| 久久久久久午夜| 亚洲最新中文字幕| 久久综合色8888| 亚洲欧美另类国产| 91久久精品国产91久久| 国产精品中文字幕在线观看| 乱人伦精品视频在线观看| 一区二区三区精品视频在线观看| 麻豆国产精品va在线观看不卡| 一区二区三区视频在线 | 欧美一区二区三区免费在线看| 韩日欧美一区二区三区| 欧美日韩国产一区精品一区 | 在线一区亚洲| 一区二区视频在线观看| 欧美日韩喷水| 麻豆精品视频在线观看视频| 亚洲免费伊人电影在线观看av| 亚洲高清电影| 久久精品视频在线播放| 亚洲视频1区| 亚洲精品一区二区三区蜜桃久| 国产香蕉97碰碰久久人人| 国产精品草草| 欧美日韩美女一区二区| 麻豆精品精品国产自在97香蕉| 久久国产综合精品| 亚洲欧美网站| 亚洲欧美另类国产| 亚洲色无码播放|