• <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>

            colorful

            zc qq:1337220912

             

            enable_shared_from_this(轉(zhuǎn)載)

            在 C++ 中需要自己來(lái)處理內(nèi)存,稍微處理不當(dāng),就會(huì)存在非常郁悶的內(nèi)存泄漏問(wèn)題

             

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

             

            除了標(biāo)準(zhǔn)庫(kù)中的 auto_ptr 之外

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

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

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

             

            在下面的代碼中:

             

            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() 成員函數(shù),則會(huì)輸出 a 和 b 的 use_count() 都為 1 ,然后調(diào)用 2 次類型 Ansible 的析構(gòu)函數(shù),若添加了該成員函數(shù),在 a 和 b 的 use_count() 輸出為 2 ,只是調(diào)用一次 Ansible 的析構(gòu)函數(shù)。原因是 enable_shared_from_this 里面在 shared_ptr<T> 的時(shí)候構(gòu)造了一個(gè) weak_ptr 類,而 weak_ptr 只是監(jiān)視,不增加引用計(jì)數(shù)

             

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

            所以如下代碼是錯(cuò)誤的:

             

            class D:public boost::enable_shared_from_this<D>

            {

            public:

                D()

                {

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

                }

            };

             

            原因很簡(jiǎn)單,在 D 的構(gòu)造函數(shù)中雖然可以保證 enable_shared_from_this<D> 的構(gòu)造函數(shù)已經(jīng)被調(diào)用,但正如前面所說(shuō), weak_ptr 還沒(méi)有設(shè)置。

             

            如下代碼也是錯(cuò)誤的:

             

            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();

            }

             

            錯(cuò)誤原因同上。

             

            如下代碼是正確的:

             

            void main()

            {

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

                d->func();

            }

             

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

             

            結(jié)論是,不要在構(gòu)造函數(shù)中使用 shared_from_this ;其次,如果要使用 shared_ptr ,則應(yīng)該在所有地方均使用,不能使用 D d 這種方式,也決不要傳遞裸指針。


            另解:::::
            struct X

            {

                     boost::shared_ptr<X> getX()

            {

                     boost::shared_ptr<X> r ;//????如何實(shí)現(xiàn)

                     return r;

            }

            };

             

            要得到X的智能指針,只是在對(duì)象指針是受shared_ptr保護(hù)的基礎(chǔ)上的,舉例如下:

            void test_X()

            {

                     {

            X x;

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

            }

                     {

            X* x = new X();

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

            }

                     {

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

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

            }

            }

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

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久久久黑人强伦姧人妻| 蜜桃麻豆www久久国产精品| 综合久久精品色| 影音先锋女人AV鲁色资源网久久| 久久人人爽人人爽人人爽| 99久久精品免费看国产一区二区三区| 久久久久久久波多野结衣高潮| 午夜人妻久久久久久久久| 亚洲一区二区三区日本久久九| 久久男人中文字幕资源站| 久久久噜噜噜久久中文字幕色伊伊| 国产精品99精品久久免费| 久久99国产精品成人欧美| 国内精品久久久久影院薰衣草 | 久久99精品久久久久久水蜜桃 | 久久99精品久久久久久久不卡| 免费国产99久久久香蕉| 最新久久免费视频| 麻豆精品久久精品色综合| 日韩精品久久久肉伦网站| 久久久久久A亚洲欧洲AV冫 | 亚洲精品tv久久久久久久久| 国产—久久香蕉国产线看观看 | 久久久久成人精品无码| 久久精品毛片免费观看| 精品国产日韩久久亚洲| 久久久久人妻精品一区三寸蜜桃| 久久国产精品成人免费| 久久久亚洲欧洲日产国码二区| 日韩电影久久久被窝网| 国产L精品国产亚洲区久久| 久久精品中文字幕久久| 国产成人无码久久久精品一 | 99久久精品无码一区二区毛片| 少妇高潮惨叫久久久久久| 一本久久精品一区二区| 一本大道久久香蕉成人网| 久久综合色之久久综合| 亚洲色欲久久久久综合网| 香蕉久久夜色精品国产2020| 亚洲&#228;v永久无码精品天堂久久 |