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

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>
            欧美精品久久一区二区| 91久久精品国产91久久性色| 国产婷婷色一区二区三区| 欧美少妇一区| 欧美视频一区二区三区在线观看| 欧美黄色一级视频| 欧美精品九九| 国产精品99一区二区| 欧美午夜视频在线| 国产欧美日韩一区二区三区在线观看| 国产精品欧美久久久久无广告| 欧美色大人视频| 国产欧美精品日韩| 在线观看视频日韩| 一本大道久久a久久精品综合| 99精品国产在热久久婷婷| 一本色道综合亚洲| 亚洲欧美日韩一区二区| 欧美一区二区三区精品电影| 久久国产色av| 亚洲第一久久影院| 亚洲视频在线观看免费| 久久精品国产清高在天天线 | 久久久久欧美| 亚洲精品视频一区| 欧美一区二区三区在线观看视频| 久久久噜噜噜| 国产精品ⅴa在线观看h| 亚洲电影观看| 亚洲一区二区三区精品在线观看| 小黄鸭精品aⅴ导航网站入口| 亚洲片在线观看| 亚洲电影免费在线| 在线精品观看| 宅男噜噜噜66一区二区66| 午夜精品视频| 女生裸体视频一区二区三区| 欧美成人福利视频| 一区二区三区四区五区视频 | 影音先锋亚洲精品| 亚洲深爱激情| 欧美国产视频在线| 午夜在线成人av| 欧美三级日韩三级国产三级| 韩国精品主播一区二区在线观看| aa成人免费视频| 欧美成人首页| 性欧美暴力猛交69hd| 欧美日韩在线第一页| 最近中文字幕mv在线一区二区三区四区| 亚洲一区二区精品视频| 欧美韩国日本一区| 久久久激情视频| 国产午夜精品一区理论片飘花 | 久久精品亚洲乱码伦伦中文 | 最新高清无码专区| 老鸭窝亚洲一区二区三区| 国产欧美va欧美va香蕉在| 亚洲一区在线免费| 一区二区三区欧美| 欧美日韩中文字幕在线| 在线综合+亚洲+欧美中文字幕| 亚洲高清视频一区二区| 久色成人在线| 亚洲欧洲另类| 亚洲国产精品综合| 欧美sm视频| 亚洲欧洲另类| 日韩一级大片| 欧美吻胸吃奶大尺度电影| 99视频超级精品| 日韩视频在线观看一区二区| 欧美激情中文字幕一区二区| 亚洲人成网站在线播| 亚洲日本中文字幕| 欧美日韩第一区日日骚| 亚洲网站在线看| 午夜精品理论片| 黑人巨大精品欧美黑白配亚洲| 久久久久久久久岛国免费| 久久久亚洲午夜电影| 蜜桃av久久久亚洲精品| 日韩一二三区视频| 国产精品免费久久久久久| 香蕉久久夜色精品| 性色一区二区| 亚洲欧洲在线视频| 在线视频日韩| 精品成人一区二区三区四区| 亚洲第一黄色| 国产精品久久久久9999| 久久久久久久网| 欧美激情影院| 久久艳片www.17c.com| 欧美成人精品在线播放| 亚洲一区日韩| 久久精品亚洲国产奇米99| 99国产精品久久久久久久成人热| 国产精品99久久久久久久vr | 亚洲日本成人在线观看| 一本色道久久综合亚洲精品小说 | 午夜精品免费| 亚洲精品久久久久| 午夜精品久久久久| 99精品视频免费| 久久国产精品一区二区三区| 亚洲伦理中文字幕| 欧美在线地址| 亚洲图片欧美一区| 久久躁日日躁aaaaxxxx| 小黄鸭精品aⅴ导航网站入口| 美女爽到呻吟久久久久| 欧美一级夜夜爽| 欧美日韩视频一区二区| 欧美aaa级| 国产一区清纯| 亚洲专区一区| 亚洲一区久久| 欧美精品在线一区二区| 麻豆精品精品国产自在97香蕉| 欧美日韩国产色综合一二三四 | 国产欧美日韩免费看aⅴ视频| 亚洲国产一区在线| 亚洲福利视频二区| 欧美一区二区三区在| 亚洲综合欧美日韩| 欧美日韩亚洲天堂| 亚洲精品乱码久久久久久日本蜜臀| 国产日韩欧美一区二区三区在线观看| 亚洲精品免费在线| 亚洲精品欧洲精品| 免播放器亚洲| 欧美成人精品在线视频| 红桃av永久久久| 欧美一区91| 亚洲啪啪91| 欧美69视频| 在线日本高清免费不卡| 久久九九精品| 美女黄色成人网| 国产一区二区三区电影在线观看 | 国产日韩精品在线观看| 亚洲午夜免费视频| 亚洲欧美视频一区二区三区| 欧美视频国产精品| 中文一区二区| 欧美在线观看一区二区| 国产视频久久| 久久精品亚洲一区二区| 蜜桃视频一区| 亚洲日本在线观看| 欧美日韩一区二区精品| 亚洲一区二区三区精品在线观看| 亚洲欧美经典视频| 国产欧美一区二区精品秋霞影院| 午夜精品久久久久久99热| 久久综合给合| 亚洲精选在线| 国产精品亚洲综合一区在线观看| 亚洲欧美另类国产| 欧美成人精品| 亚洲香蕉在线观看| 国产手机视频精品| 美女国产一区| 一区二区三区免费观看| 久久五月婷婷丁香社区| 99re亚洲国产精品| 国产欧美一区二区三区久久| 久热精品视频在线观看| 夜夜嗨av一区二区三区中文字幕 | 99这里只有久久精品视频| 欧美一区激情| 亚洲欧洲在线免费| 国产精品中文字幕在线观看| 久久亚洲精品中文字幕冲田杏梨 | 亚洲人成在线影院| 欧美专区亚洲专区| 亚洲精品免费一区二区三区| 国产精品久久久久aaaa樱花| 久久精彩免费视频| 亚洲久久一区| 久久米奇亚洲| 亚洲一区二区三区四区在线观看 | 欧美精品www在线观看| 久久爱www| 亚洲亚洲精品三区日韩精品在线视频| 久久亚洲色图| 午夜精品久久久久久久99黑人| 亚洲黄色在线看| 国产一区二区三区四区hd| 欧美精品自拍| 美女任你摸久久| 欧美在线观看你懂的| 99精品99久久久久久宅男| 欧美国产日本在线| 久久激情视频久久| 亚洲欧美国产不卡| 国产精品亚洲一区| 一区二区欧美精品| 亚洲国产欧美另类丝袜|