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

colorful

zc qq:1337220912

 

enable_shared_from_this(轉載)

在 C++ 中需要自己來處理內存,稍微處理不當,就會存在非常郁悶的內存泄漏問題

 

還好,現在 C++ 中推出了強大的智能指針,即 smart_ptr ,本文先稍微介紹一下 smart_ptr ,然后具體說說 shared_ptr 和 weak_ptr ,特別是 enable_shared_from_this 和 shared_from_this

 

除了標準庫中的 auto_ptr 之外

在 boost 或者 tr1 中的 smart_ptr 主要是有下面幾種

  • scoped_ptr
  • scoped_array
  • shared_ptr
  • shared_array
  • intrusive_ptr
  • weak_ptr

這些里面最難理解的是綜合應用了 weak_ptr 和 shared_ptr 的 enable_shared_from_this 類,在該類中定了成員函數 shared_from_this() ,返回 shared_ptr<T> 。這個函數僅在 shared_ptr<T> 的構造函數被調用之后才能使用。原因是 enable_shared_from_this::weak_ptr 并不在構造函數中設置(此處的構造函數指的是類型 T 的構造函數),而是在 shared_ptr<T> 的構造函數中設置(此處的構造函數指的是類型 shared_ptr<T> 的構造函數)。

 

在下面的代碼中:

 

Cpp代碼
  1. #include <iostream>   
  2.   
  3. #include <string>   
  4.   
  5.     
  6.   
  7. #include <boost/shared_ptr.hpp>   
  8.   
  9. #include <boost/weak_ptr.hpp>   
  10.   
  11. #include <boost/enable_shared_from_this.hpp>   
  12.   
  13.     
  14.   
  15. using namespace std;   
  16.   
  17.     
  18.   
  19. struct Ansible   
  20.   
  21.   : public boost::enable_shared_from_this<Ansible>   
  22.   
  23. {   
  24.   
  25.     boost::shared_ptr<Ansible> get_shared()   
  26.   
  27.     {   
  28.   
  29.         boost::shared_ptr<Ansible> r(this);   
  30.   
  31.     
  32.   
  33.         return r;   
  34.   
  35.     }   
  36.   
  37.     
  38.   
  39.     ~Ansible()   
  40.   
  41.     {   
  42.   
  43.         cout<<"Destructor"<<endl;   
  44.   
  45.     }   
  46.   
  47. };   
  48.   
  49.     
  50.   
  51. int main(int argc,char* argv[])   
  52.   
  53. {   
  54.   
  55.     boost::shared_ptr<Ansible> a(new Ansible);   
  56.   
  57.     Ansible& r = *a;   
  58.   
  59.     //boost::shared_ptr<Ansible> b = r.get_shared();   
  60.   
  61.     boost::shared_ptr<Ansible> b = r.shared_from_this();   
  62.   
  63.     
  64.   
  65.     cout<<"Reference Number "<<a.use_count()<<" "<<b.use_count()<<endl;   
  66.   
  67.     
  68.   
  69.     return 0;   
  70.   
  71. }  
#include <iostream> #include <string> #include <boost/shared_ptr.hpp> #include <boost/weak_ptr.hpp> #include <boost/enable_shared_from_this.hpp> using namespace std; struct Ansible : public boost::enable_shared_from_this<Ansible> { boost::shared_ptr<Ansible> get_shared() { boost::shared_ptr<Ansible> r(this); return r; } ~Ansible() { cout<<"Destructor"<<endl; } }; int main(int argc,char* argv[]) { boost::shared_ptr<Ansible> a(new Ansible); Ansible& r = *a; //boost::shared_ptr<Ansible> b = r.get_shared(); boost::shared_ptr<Ansible> b = r.shared_from_this(); cout<<"Reference Number "<<a.use_count()<<" "<<b.use_count()<<endl; return 0; }

 

若不使用 shared_from_this() 成員函數,則會輸出 a 和 b 的 use_count() 都為 1 ,然后調用 2 次類型 Ansible 的析構函數,若添加了該成員函數,在 a 和 b 的 use_count() 輸出為 2 ,只是調用一次 Ansible 的析構函數。原因是 enable_shared_from_this 里面在 shared_ptr<T> 的時候構造了一個 weak_ptr 類,而 weak_ptr 只是監視,不增加引用計數

 

(下面是轉載: http://huyuguang1976.spaces.live.com/blog/cns!2A9E272E3C33AFF1!185.entry

所以如下代碼是錯誤的:

 

class D:public boost::enable_shared_from_this<D>

{

public:

    D()

    {

        boost::shared_ptr<D> p=shared_from_this();

    }

};

 

原因很簡單,在 D 的構造函數中雖然可以保證 enable_shared_from_this<D> 的構造函數已經被調用,但正如前面所說, weak_ptr 還沒有設置。

 

如下代碼也是錯誤的:

 

class D:public boost::enable_shared_from_this<D>

{

public:

    void func()

    {

        boost::shared_ptr<D> p=shared_from_this();

    }

};

 

void main()

{

    D d;

    d.func();

}

 

錯誤原因同上。

 

如下代碼是正確的:

 

void main()

{

    boost::shared_ptr<D> d(new D);

    d->func();

}

 

這里 boost::shared_ptr<D> d(new D) 實際上執行了 3 個動作:首先調用 enable_shared_from_this<D> 的構造函數;其次調用 D 的構造函數;最后調用 shared_ptr<D> 的構造函數。是第 3 個動作設置了 enable_shared_from_this<D> 的 weak_ptr ,而不是第 1 個動作。這個地方是很違背 c++ 常理和邏輯的,必須小心。

 

結論是,不要在構造函數中使用 shared_from_this ;其次,如果要使用 shared_ptr ,則應該在所有地方均使用,不能使用 D d 這種方式,也決不要傳遞裸指針。


另解:::::
struct X

{

         boost::shared_ptr<X> getX()

{

         boost::shared_ptr<X> r ;//????如何實現

         return r;

}

};

 

要得到X的智能指針,只是在對象指針是受shared_ptr保護的基礎上的,舉例如下:

void test_X()

{

         {

X x;

                  boost::shared_ptr<X> px = x.getX();//錯誤

}

         {

X* x = new X();

boost::shared_ptr<X> px = x->getX();//錯誤

}

         {

boost::shared_ptr<X>  x (new X());

boost::shared_ptr<X> px = x->getX();//正確

}

}

posted on 2012-06-22 22:41 多彩人生 閱讀(500) 評論(0)  編輯 收藏 引用 所屬分類: boost

導航

統計

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品qvod| 亚洲大片免费看| 蜜桃久久精品一区二区| 欧美亚洲日本一区| 欧美激情一二三区| 国产欧美综合在线| 亚洲日本电影| 欧美激情中文字幕乱码免费| 国产精品夜夜嗨| 91久久精品国产91久久| 免费不卡在线观看| 国产女主播一区| 在线亚洲欧美视频| 亚洲精品免费在线| 你懂的国产精品永久在线| 国产日本欧美一区二区三区| 一本综合久久| 亚洲一区二区日本| 亚洲精选在线观看| 亚洲国产老妈| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久中文久久字幕| 久久精品女人| 亚洲精品美女免费| 亚洲欧美激情精品一区二区| 国产精品成人观看视频免费| 亚洲第一天堂无码专区| 欧美日韩久久久久久| 午夜精品在线观看| 午夜精品国产精品大乳美女| 欧美亚洲视频一区二区| 性色av一区二区三区| 亚洲欧洲日韩女同| 亚洲一区免费观看| 亚洲美女色禁图| 久久久99精品免费观看不卡| 久久久99爱| 欧美精品xxxxbbbb| 久久久久久久久久久久久久一区| 免费一级欧美在线大片| 一区二区三区日韩| 欧美一进一出视频| 欧美亚洲一区三区| 欧美色综合天天久久综合精品| 欧美11—12娇小xxxx| 9国产精品视频| 日韩写真视频在线观看| 国产精品99久久99久久久二8| 亚洲第一页在线| 久久福利视频导航| 国产一区二区三区黄| 亚洲欧美国内爽妇网| 久久久久国产精品一区二区| 一色屋精品视频免费看| 欧美成人在线网站| 亚洲欧美日韩精品| 欧美福利精品| 亚洲视频高清| 精品不卡在线| 欧美日韩免费网站| 亚洲欧美国产高清| 欧美激情亚洲精品| 欧美伊人久久| 9l国产精品久久久久麻豆| 国产欧美一区二区三区视频| 欧美国产日韩精品| 香蕉免费一区二区三区在线观看 | 欧美性大战久久久久久久蜜臀| 米奇777在线欧美播放| 亚洲精品资源美女情侣酒店| 欧美日一区二区在线观看 | 在线亚洲激情| 国产精品青草久久久久福利99| 国产色产综合产在线视频| 午夜亚洲精品| 亚洲第一页在线| 久久精品视频免费播放| 一本久久综合| 99re热这里只有精品视频| 国产精品久久二区| 久久成人免费日本黄色| 一区二区av在线| 午夜欧美视频| 亚洲视频导航| 亚洲国产一区二区在线| 国产精品日韩欧美| 国产一区清纯| 亚洲黄色高清| 亚洲精品视频在线看| 一本色道久久加勒比88综合| 欧美性理论片在线观看片免费| 欧美国产视频日韩| 久久久精品一区| 欧美亚洲免费高清在线观看| 欧美一区二区三区的| 久久丁香综合五月国产三级网站| 久久久国产亚洲精品| 免费在线看一区| 亚洲精品在线一区二区| 亚洲国产欧美不卡在线观看| 蜜桃av噜噜一区| 亚洲第一区色| 日韩午夜av电影| 久久九九精品| 国产精品久久久999| 有坂深雪在线一区| 亚洲黄一区二区| 亚洲国产中文字幕在线观看| 亚洲国产成人av| 亚洲一区二区三区成人在线视频精品| 亚洲欧美激情视频| 欧美大片一区二区三区| 一区二区日韩免费看| 久久久蜜桃精品| 在线看视频不卡| 亚洲嫩草精品久久| 亚洲二区精品| 午夜一区在线| 欧美日韩中文在线观看| 亚洲精品国产视频| 亚洲第一精品福利| 欧美日韩精品久久久| 国产尤物精品| 性色一区二区三区| 欧美日韩天天操| 亚洲精品国产精品国自产观看浪潮 | 欧美日韩国产成人在线观看| 亚洲三级电影在线观看| 亚洲高清av| 一本色道久久88综合日韩精品| 久久久久一区二区| 国精品一区二区三区| 亚洲欧美在线磁力| 欧美成人中文| 一区二区欧美亚洲| 欧美人与禽猛交乱配视频| 久久精品导航| 日韩视频在线观看国产| 亚洲午夜电影| 欧美国产日韩一区二区| 免费高清在线一区| 日韩亚洲欧美成人| 欧美在线亚洲一区| 日韩西西人体444www| 亚洲国产乱码最新视频| 美玉足脚交一区二区三区图片| 亚洲黄一区二区| 国产精品99久久久久久www| 国产揄拍国内精品对白| 亚洲区欧美区| 激情成人在线视频| 午夜视频在线观看一区二区三区| 99视频精品免费观看| 国产精品国产三级国产普通话蜜臀 | 午夜精品一区二区三区四区 | 欧美成人视屏| 久久大逼视频| 国产精品蜜臀在线观看| 免费视频亚洲| 欧美α欧美αv大片| 国产精品99久久久久久久vr| 欧美伊人影院| 亚洲欧美高清| 国产精品大全| 一本色道久久综合亚洲二区三区 | 亚洲欧美日韩精品久久久| 久久综合给合久久狠狠色 | 香蕉精品999视频一区二区| 在线日韩电影| 久久久精品一区二区三区| 欧美午夜精品久久久久久人妖| 久久gogo国模裸体人体| 农夫在线精品视频免费观看| 久久久久一区二区三区| 欧美激情亚洲视频| 久久久青草婷婷精品综合日韩| 国产欧美视频一区二区三区| 性色一区二区| 午夜亚洲性色视频| 久久精品视频免费| 久久精品视频亚洲| 精品999在线观看| 久久综合九色综合欧美狠狠| 亚洲第一黄色网| 久久精品最新地址| 亚洲免费在线播放| 欧美日韩一区二区三区四区在线观看| 亚洲精品美女久久7777777| 99国产精品久久久久久久久久| 欧美午夜一区| 一区二区日韩| 欧美日韩精选| 在线视频日本亚洲性| 一区二区久久| 欧美偷拍一区二区| 久久精品首页| 亚洲免费视频观看| 亚洲伦理在线| 欧美成ee人免费视频| 一区二区三区日韩|