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

   C++ 技術中心

   :: 首頁 :: 聯系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

鄭重聲明:本BLOG所發表的原創文章,作者保留一切權利。必須經過作者本人同意后方可轉載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

留言簿(27)

搜索

  •  

最新隨筆

最新評論

評論排行榜

使用enable_shared_from_this

說明
The header <boost/enable_shared_from_this.hpp> defines the class template enable_shared_from_this. It is used as a base class that allows a shared_ptr to the current object to be obtained from within a member function.
繼承該類就可以進行基于當前子類進行安全的weap_ptr到shared_ptr的轉換...

代碼實例
以下代碼中Y類繼承enable_shared_from_this,, 從而我們可以直接在函數中調用shared_from_this獲得該對象的shared_ptr

class Y: public enable_shared_from_this<Y>
{
public:

    shared_ptr<Y> f()
    {
        return shared_from_this();
    }
}

int main()
{
    shared_ptr<Y> p(new Y);
// 調用f獲得shared_ptr

    shared_ptr<Y> q = p->f();
    assert(p == q);
    assert(!(p < q || q < p)); // p and q must share ownership

}


該類的實現


template<class T> class enable_shared_from_this
{
protected:

    enable_shared_from_this()
    {
    }

    enable_shared_from_this(enable_shared_from_this const &)
    {
    }

    enable_shared_from_this & operator=(enable_shared_from_this const &)
    {
        return *this;
    }

    ~enable_shared_from_this()
    {
    }

public:

    shared_ptr<T> shared_from_this()
    {
        shared_ptr<T> p(_internal_weak_this);
        BOOST_ASSERT(p.get() == this);
        return p;
    }

    shared_ptr<T const> shared_from_this() const
    {
        shared_ptr<T const> p(_internal_weak_this);
        BOOST_ASSERT(p.get() == this);
        return p;
    }

// Note: No, you don't need to initialize _internal_weak_this

//

// Please read the documentation, not the code

//

// http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html


    typedef T _internal_element_type; // for bcc 5.5.1

    mutable weak_ptr<_internal_element_type> _internal_weak_this;
};


結論

這個實用類提供了簡單的shared_ptr轉換和安全的weak式驗證... 這樣通過繼承就可以使用shared_from_this進行安全當前類weak_ptr到shared_ptr的轉換...

enable_from_this方法的使用與陷阱
enable_from_this 的使用與實現原理說明:
shared_from_this()是enable_shared_from_this的成員函數,返回shared_ptr;
注意的是,這個函數僅在shared_ptr的構造函數被調用之后才能使用。
原因是enable_shared_from_this::weak_ptr并不在構造函數中設置,而是在shared_ptr的構造函數中設置。
錯誤的使用代碼一:

#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>

#include <iostream>
using namespace std;

class D: public boost::enable_shared_from_this<D>
{
public:
    D()
    {
        cout<<"D::D()"<<endl;
        boost::shared_ptr<D> p = shared_from_this();
    }    
};

int main()
{
    boost::shared_ptr<D> a(new D);
    return 0;    
}


程序編譯通過,執行結果如下:
D::D()
terminate called after throwing an instance of 'boost::exception_detail::clone_impl >'
  what():  tr1::bad_weak_ptr
Aborted
說明在D的構造函數中調用shared_from_this(), 此時D的實例本身尚未構造成功,weak_ptr也就尚未設置,所以程序拋出tr1::bad_weak_ptr異常。
錯誤的使用代碼二:

#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>

#include <iostream>
using namespace std;

class D: public boost::enable_shared_from_this<D>
{
public:
    D()
    {
        cout<<"D::D()"<<endl;
    }
    
    void func()
    {
        cout<<"D::func()"<<endl;
        boost::shared_ptr<D> p = shared_from_this();
    }    
};

int main()
{
    D d;
    d.func();
    return 0;    
}


程序編譯通過,執行結果如下:
D::D()
D::func()
terminate called after throwing an instance of 'boost::exception_detail::clone_impl >'
  what():  tr1::bad_weak_ptr
Aborted
失敗原因分析:
在主函數main中,D的實例是在棧上構造,沒有使用boost::shared_ptr 的構造方式,
所以boost::enable_shared_from_this中的weak_ptr所指的函數對象也就沒有被賦值,
在調用d.func()中使用shared_from_this()函數時
----注:shared_from_this的函數實現 ------
    shared_ptr shared_from_this()
    {
        shared_ptr p( weak_this_ );
        BOOST_ASSERT( p.get() == this );
        return p;
    }
----注:shared_from_this的函數實現 ------
調用BOOST_ASSERT( p.get() == this );  失敗,拋出以上異常。
最后,我們給出share_from_this()的正確使用例子:

#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>

#include <iostream>
using namespace std;

class D: public boost::enable_shared_from_this<D>
{
public:
    D()
    {
        cout<<"D::D()"<<endl;
    }
    
    void func()
    {
        cout<<"D::func()"<<endl;
        boost::shared_ptr<D> p = shared_from_this();
    }    
};

int main()
{
    boost::shared_ptr<D> p(new D);
    p->func();
    return 0;    
}    


執行結果:
D::D()
D::func()

posted on 2017-03-07 14:17 C++技術中心 閱讀(1304) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久国产精品亚洲77777| 免费在线观看成人av| 国产视频一区在线观看| 国产精品羞羞答答xxdd| 国产精品99免费看| 国产精一区二区三区| 国产欧美日韩视频在线观看| 国模 一区 二区 三区| 亚洲高清中文字幕| 这里只有精品视频在线| 久久午夜精品| 牛牛影视久久网| 欧美性猛交xxxx乱大交蜜桃| 亚洲片在线观看| 亚洲日本成人网| 一区二区三区四区国产| 久久先锋影音av| 亚洲国产精品一区在线观看不卡 | 欧美中文字幕在线视频| 久久影院亚洲| 日韩亚洲在线| 亚洲第一在线综合网站| 在线中文字幕不卡| 久久大香伊蕉在人线观看热2| 久色成人在线| 国产乱码精品一区二区三区忘忧草| 狠狠操狠狠色综合网| 一区二区三区四区五区精品视频 | 一本到12不卡视频在线dvd| 欧美一级专区免费大片| 欧美视频免费在线观看| 亚洲成色www久久网站| 午夜宅男欧美| 亚洲日本激情| 狼人社综合社区| 国产亚洲人成a一在线v站| 在线视频精品| 亚洲国产一区二区三区青草影视| 欧美伊人久久久久久午夜久久久久| 欧美日韩国产成人精品| 在线观看亚洲精品| 久久激情视频久久| 亚洲一区二区不卡免费| 欧美日韩国产123区| 亚洲国产婷婷香蕉久久久久久| 性欧美18~19sex高清播放| 亚洲美洲欧洲综合国产一区| 另类欧美日韩国产在线| 韩国成人精品a∨在线观看| 性欧美超级视频| 中文网丁香综合网| 国产精品二区三区四区| 一区二区三区日韩| 亚洲精选一区| 欧美日韩情趣电影| 99精品国产福利在线观看免费| 欧美激情在线狂野欧美精品| 久热精品在线| 亚洲日本国产| 亚洲精品美女久久久久| 欧美精品一区三区在线观看| 欧美视频成人| 亚洲五月六月| 正在播放欧美视频| 欧美日韩在线大尺度| 一区二区三区视频免费在线观看| 日韩视频国产视频| 国产精品v欧美精品v日本精品动漫| 一区二区日韩精品| 亚洲视频在线一区观看| 久久aⅴ国产紧身牛仔裤| 国产拍揄自揄精品视频麻豆| 欧美亚洲综合网| 欧美一区二区三区视频在线| 国产综合色精品一区二区三区| 久久婷婷国产综合精品青草| 老牛影视一区二区三区| 亚洲精品字幕| 亚洲视频精品| 国产在线观看精品一区二区三区| 久久综合电影| 欧美极品在线视频| 西瓜成人精品人成网站| 久久综合久久久久88| 99re66热这里只有精品3直播| 一区二区欧美视频| 狠狠色丁香久久婷婷综合丁香| 欧美激情第3页| 国产精品护士白丝一区av| 久久精品女人天堂| 欧美激情91| 久久久91精品国产| 欧美日韩国产大片| 久久精品欧美日韩精品| 模特精品裸拍一区| 香蕉久久一区二区不卡无毒影院| 久久久久久有精品国产| 99国产精品一区| 久久www成人_看片免费不卡| 99re66热这里只有精品3直播 | 欧美一区二区三区男人的天堂 | 国内偷自视频区视频综合| 欧美成人在线免费视频| 国产精品视频网址| 亚洲破处大片| 伊人久久大香线蕉综合热线| 一区二区三区.www| 亚洲黄网站黄| 久久国产精品亚洲77777| 亚洲一级黄色av| 欧美成人黄色小视频| 亚洲国产另类 国产精品国产免费| 亚洲欧洲一区二区在线播放| 国内精品久久久久久久影视麻豆| 亚洲精品久久久久久久久久久久久 | 欧美亚洲尤物久久| 一区二区欧美在线| 免费一级欧美片在线播放| 久久久99国产精品免费| 欧美日韩免费在线| 亚洲激情另类| 亚洲国产一区二区三区青草影视| 欧美亚洲视频一区二区| 午夜影视日本亚洲欧洲精品| 欧美日韩免费一区二区三区视频| 欧美破处大片在线视频| 免费日韩av电影| 国产一区二区三区四区| 亚洲一区二区三区久久| 亚洲一区三区视频在线观看| 欧美激情中文不卡| 亚洲第一区在线观看| 亚洲国产日韩欧美综合久久| 久久欧美中文字幕| 免费一级欧美在线大片| 在线观看国产成人av片| 久久精品国产欧美激情| 久久午夜av| 一区二区三区亚洲| 久久久午夜精品| 欧美不卡在线| 亚洲国产一区二区精品专区| 免费不卡欧美自拍视频| 欧美黑人在线播放| 亚洲精品激情| 欧美日韩亚洲一区二| 一本久久综合亚洲鲁鲁五月天| 在线视频欧美日韩精品| 欧美亚男人的天堂| 亚洲欧美日韩在线高清直播| 久久精品一本| 亚洲国产成人porn| 欧美—级高清免费播放| 日韩亚洲欧美一区| 性欧美18~19sex高清播放| 国产一区二区三区精品久久久| 久久精品视频在线播放| 亚洲电影第三页| 亚洲性色视频| 国内久久视频| 欧美人成网站| 香蕉精品999视频一区二区| 噜噜噜躁狠狠躁狠狠精品视频| 91久久久在线| 国产精品老牛| 老司机午夜精品视频在线观看| 亚洲精品欧美激情| 久久成人免费网| 亚洲欧洲日本国产| 国产精品普通话对白| 久久先锋影音av| 亚洲天堂免费观看| 欧美成人精品福利| 午夜精品久久久久久久| 一区在线电影| 国产精品一区二区久久精品| 麻豆国产精品777777在线| 亚洲尤物精选| 91久久中文| 美玉足脚交一区二区三区图片| 最新69国产成人精品视频免费| 午夜精品一区二区三区四区| 亚洲国产高清高潮精品美女| 国产精品狼人久久影院观看方式| 久久九九国产精品| 亚洲一区在线看| 亚洲美女av在线播放| 免费中文日韩| 欧美影院成年免费版| 99riav1国产精品视频| 黄色成人在线免费| 国产精品视频区| 欧美视频一区二区三区| 欧美黄色一区| 免费成人性网站| 久久九九电影| 久久精品日韩| 性刺激综合网| 久久大逼视频| 亚洲调教视频在线观看|