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

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 閱讀(2140) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区三区欧美亚洲| 欧美一区二区三区四区高清| 另类亚洲自拍| 亚洲国产va精品久久久不卡综合| 老司机精品视频一区二区三区| 午夜精品理论片| 国外精品视频| 欧美大片在线观看一区| 男女激情久久| 亚洲欧美日韩综合| 欧美在线短视频| 亚洲国产毛片完整版| 亚洲国产精品电影| 欧美日本在线观看| 欧美在线一级视频| 久久婷婷综合激情| 亚洲视屏一区| 午夜精品视频一区| 亚洲国产另类久久久精品极度| 亚洲国产成人av好男人在线观看| 欧美日韩高清在线观看| 久久本道综合色狠狠五月| 久久精品欧美日韩精品| 日韩一区二区电影网| 亚洲影院高清在线| 伊甸园精品99久久久久久| 欧美激情自拍| 国产美女精品免费电影| 亚洲高清av在线| 国产精品一卡二| 欧美激情一区二区三区在线| 国产精品国产三级国产aⅴ入口 | 久久字幕精品一区| 中文国产成人精品| 久久久www成人免费无遮挡大片| 亚洲美女淫视频| 久久精品人人做人人综合 | 国产免费亚洲高清| 亚洲国产中文字幕在线观看| 国产精品中文在线| 亚洲精品小视频| 在线观看一区| 性欧美大战久久久久久久久| 99热免费精品| 久久综合久久久| 久久精品一区二区三区不卡牛牛| 欧美国产一区视频在线观看 | 亚洲人人精品| 欧美在线视频日韩| 亚洲欧美日韩系列| 欧美日韩精品一区| 亚洲国产日韩一区| 在线观看视频亚洲| 久久精品亚洲精品| 久久精品国产精品| 国产精品系列在线| 亚洲一区bb| 一区二区欧美精品| 欧美二区在线| 欧美激情精品久久久久久变态| 国产视频久久| 午夜精品久久久久久久99樱桃| 亚洲一区二区三区精品视频| 欧美久久久久久久| 亚洲日韩成人| 一本在线高清不卡dvd| 欧美成人午夜77777| 亚洲二区视频在线| 亚洲精品欧美极品| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲午夜小视频| 欧美日韩国产综合视频在线观看中文| 欧美国产一区二区在线观看| 在线观看视频免费一区二区三区 | 亚洲黄色成人| 一区二区三区欧美激情| 欧美日韩在线播| 一区二区成人精品| 亚洲欧美偷拍卡通变态| 国产精品爽黄69| 午夜久久电影网| 久久综合五月| 亚洲精品黄色| 欧美日韩在线免费| 亚洲免费在线电影| 久久综合狠狠综合久久综青草| 在线成人欧美| 欧美日韩国产一区二区三区地区 | 亚洲高清成人| 99国产精品久久| 国产精品激情av在线播放| 亚洲欧美伊人| 欧美激情第六页| 亚洲视频一二三| 国产伦精品一区二区三区| 亚洲欧美日本在线| 欧美电影在线播放| 亚洲午夜影视影院在线观看| 国产精品手机在线| 麻豆精品视频在线观看| 99精品国产在热久久| 欧美在线视频免费| 亚洲精品乱码| 国产目拍亚洲精品99久久精品| 久久九九99视频| 亚洲免费观看高清完整版在线观看熊| 欧美一区二区三区视频免费播放| 亚洲福利av| 国产精品女主播| 欧美ed2k| 午夜久久久久久| 亚洲国产精品va在线观看黑人| 亚洲欧美激情一区| 亚洲精品在线免费| 国产视频综合在线| 欧美午夜精品电影| 快she精品国产999| 欧美一级大片在线免费观看| 91久久精品国产91性色tv| 久久国产成人| 亚洲午夜精品一区二区三区他趣| 一区在线影院| 国产日韩欧美一区二区三区四区| 欧美女主播在线| 久久久久久亚洲精品不卡4k岛国| 一区二区三区日韩欧美精品| 亚洲电影自拍| 欧美aaaaaaaa牛牛影院| 久久久久www| 亚洲欧美国产三级| 亚洲特级毛片| 一本久久综合亚洲鲁鲁| 最新精品在线| 1024精品一区二区三区| 国语自产精品视频在线看抢先版结局| 国产精品国产三级国产普通话99| 欧美激情成人在线视频| 美女视频一区免费观看| 久久精品夜色噜噜亚洲a∨| 午夜视频在线观看一区二区三区 | 中国成人黄色视屏| 亚洲精品三级| 亚洲乱码精品一二三四区日韩在线| 欧美高清视频在线| 欧美激情一区二区三区高清视频| 麻豆久久婷婷| 欧美成年人网| 亚洲国产一区二区视频| 亚洲狠狠婷婷| 夜夜嗨av一区二区三区四季av| 亚洲美女在线一区| 在线视频中文亚洲| 亚洲一区二区在线看| 午夜精品久久久久99热蜜桃导演| 亚洲欧美视频在线观看| 欧美专区日韩专区| 久久久久久久高潮| 欧美成人中文| 欧美日韩国产免费| 国产精品视频九色porn| 国产视频精品va久久久久久| 韩国一区二区在线观看| 亚洲黄色精品| 亚洲午夜久久久久久尤物| 亚洲免费视频观看| 久久久久在线| 亚洲第一中文字幕在线观看| 亚洲日韩欧美一区二区在线| 这里只有精品电影| 欧美在线日韩在线| 欧美大学生性色视频| 欧美午夜精品久久久久免费视 | 欧美1区2区| 欧美视频一区二区三区| 国产欧美一区二区三区视频| 狠狠干成人综合网| 日韩视频―中文字幕| 亚洲欧美在线网| 蜜桃久久av一区| 亚洲精品久久久久久久久久久久 | 这里只有精品视频| 欧美在线免费视频| 欧美日韩精品一区视频| 国产一区亚洲| 一本大道久久a久久综合婷婷| 午夜激情一区| 亚洲第一精品在线| 亚洲综合日韩中文字幕v在线| 久久频这里精品99香蕉| 国产精品国产精品| 最新日韩精品| 久久午夜电影网| 在线视频你懂得一区二区三区| 久久精品一区二区| 欧美日韩天堂| 亚洲国产精品美女| 久久久人成影片一区二区三区观看| 亚洲精品久久久久久下一站 | 欧美国产精品中文字幕| 国产午夜精品麻豆|