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

            flushthink

            just for essential skill
            隨筆 - 14, 文章 - 0, 評論 - 30, 引用 - 0
            數據加載中……

            enable_shared_from_this、weak_ptr、shared_ptr

            網上說weak_ptr是shared_ptr的觀察員,weak_ptr不會干擾shared_ptr機制,當weak_ptr所觀察的shared_ptr要釋放對象時,weak_ptr的指針將被置空,避免空懸指針。
            weak_ptr只能通過shared_ptr或weak_ptr構造。

            對于一個shared_ptr,它分別對強引用和弱引用都做了計數。

            上圖是下面代碼的調試信息。
            #include "stdafx.h"
            #include 
            <iostream>
            #include 
            <boost/shared_ptr.hpp>
            #include 
            <boost/weak_ptr.hpp>
            #include 
            <boost/enable_shared_from_this.hpp>

            struct A
            {};

            int _tmain(int argc, _TCHAR* argv[])
            {
                boost::shared_ptr
            <A> a(new A);

                
            return 0;
            }

            當一個shared_ptr構造,use_count_和weak_count_都被賦值為1。



            上圖是下面代碼調試信息。
            #include "stdafx.h"
            #include 
            <iostream>
            #include 
            <boost/shared_ptr.hpp>
            #include 
            <boost/weak_ptr.hpp>
            #include 
            <boost/enable_shared_from_this.hpp>

            struct A
            {};

            class B 
            {
            public:
                B()
                    : mA(
            new A)
                
            {
                }


                
            /// 把指針返回出去
                boost::shared_ptr<A> get()
                
            {
                    
            return mA;
                }

            private:
                boost::shared_ptr
            <A> mA;
            }
            ;

            int _tmain(int argc, _TCHAR* argv[])
            {
                
            {
                    B b;
                    boost::weak_ptr
            <A> wp1 = b.get();
                    boost::weak_ptr
            <A> wp2 = b.get();
                    boost::shared_ptr
            <A> sp1 = b.get();
                    boost::shared_ptr
            <A> sp2 = b.get();
                }


                
            return 0;
            }



            當一個對象返回出一個自身對象shared_ptr,一般用enable_shared_from_this,而enable_shared_from_this就是用weak_ptr來實現的。

             

            #include "stdafx.h"
            #include 
            <iostream>
            #include 
            <boost/shared_ptr.hpp>
            #include 
            <boost/weak_ptr.hpp>
            #include 
            <boost/enable_shared_from_this.hpp>

            struct A : public boost::enable_shared_from_this<A>
            {

                boost::shared_ptr
            <A> get()
                
            {
                    boost::shared_ptr
            <A> holder(new A);
                    
            return holder;
                }

            }
            ;

            int _tmain(int argc, _TCHAR* argv[])
            {
                
                A a;
                boost::shared_ptr
            <A> aa = a.get();
                
            return 0;
            }

            上述代碼的對象構造是:enable_shared_from_this<A>,然后是A,再就是shared_ptr,所以必須在構造完成之后再進行對象智能指針的創建。這是一種循環依賴關系,一般循環依賴都要用到weak_ptr。

            針對循環依賴的shared_ptr如下:
            #include "stdafx.h"
            #include 
            <iostream>
            #include 
            <boost/shared_ptr.hpp>
            #include 
            <boost/weak_ptr.hpp>
            #include 
            <boost/enable_shared_from_this.hpp>

            /// 相互依賴
            struct Product;
            struct ProductManager;

            typedef boost::shared_ptr
            <Product> ProductPtr;
            typedef boost::shared_ptr
            <ProductManager> ProductManagerPtr;

            struct Product
            {
                Product()
                
            {
                    std::cout 
            << "Product 構造" << std::endl;
                }

                
            ~Product()
                
            {
                    std::cout 
            << "Product 析構" << std::endl;
                }

                ProductManagerPtr mMgr;
            }
            ;

            struct ProductManager
            {
                ProductManager()
                
            {
                    std::cout 
            << "ProductManager 構造" << std::endl;
                }

                
            ~ProductManager()
                
            {
                    std::cout 
            << "ProductManager 析構" << std::endl;
                }

                ProductPtr mProduct;
            }
            ;

            int _tmain(int argc, _TCHAR* argv[])
            {
                ProductPtr product(
            new Product);
                ProductManagerPtr productMgr(
            new ProductManager);
                product
            ->mMgr = productMgr;
                productMgr
            ->mProduct = product;
                
            return 0;
            }

            結果是:


            不能釋放對象。
            對于這種情況要這么做:

            struct Product
            {
                Product()
                
            {
                    std::cout 
            << "Product 構造" << std::endl;
                }

                
            ~Product()
                
            {
                    std::cout 
            << "Product 析構" << std::endl;
                }

                boost::weak_ptr
            <ProductManager> mMgr;
            }
            ;


             

            posted on 2009-09-17 15:14 tiny 閱讀(2121) 評論(0)  編輯 收藏 引用

            久久夜色精品国产网站| 亚洲午夜久久久久久久久电影网 | 久久精品国产亚洲AV香蕉| 久久精品国产亚洲av麻豆图片| 精品久久久久久久无码| 久久激情亚洲精品无码?V| 99蜜桃臀久久久欧美精品网站 | 97久久婷婷五月综合色d啪蜜芽 | 精品久久久噜噜噜久久久| 国产成人精品综合久久久| 久久亚洲国产最新网站| 国产精品久久久天天影视| 香港aa三级久久三级老师2021国产三级精品三级在 | 亚洲精品美女久久777777| 999久久久免费国产精品播放| 精品国产日韩久久亚洲| 久久电影网2021| 日本久久久久亚洲中字幕| 午夜精品久久久内射近拍高清| 青青国产成人久久91网| 久久婷婷五月综合国产尤物app| 久久综合伊人77777| 韩国三级中文字幕hd久久精品 | 国产精品99久久不卡| 99久久综合狠狠综合久久止| 人妻无码久久一区二区三区免费| 亚洲精品国产自在久久| 久久久久国产精品嫩草影院| 91精品观看91久久久久久| 国产欧美久久久精品| 996久久国产精品线观看| 久久99精品久久久久久hb无码| 无码精品久久久久久人妻中字| 色妞色综合久久夜夜| 国产精品久久久久久久久软件 | 婷婷五月深深久久精品| 99久久做夜夜爱天天做精品| 欧美日韩久久中文字幕| 精产国品久久一二三产区区别 | 久久精品中文字幕第23页| 品成人欧美大片久久国产欧美...|