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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            六月天综合网| 欧美久久久久久久久| 国产精品午夜电影| 亚洲在线一区二区三区| 亚洲一区久久| 激情视频一区二区三区| 欧美大片第1页| 欧美日本韩国一区二区三区| 亚洲一级网站| 欧美制服丝袜| 日韩视频二区| 亚洲欧美日韩人成在线播放| 一区二区三区中文在线观看 | 91久久夜色精品国产网站| 亚洲国产一区在线| 欧美午夜寂寞影院| 久久人人97超碰精品888| 欧美国产一区二区三区激情无套| 这里只有精品视频在线| 欧美影院精品一区| 日韩一级在线| 欧美在线一二三区| 一区二区电影免费观看| 久久成人国产| 亚洲午夜av| 久久人人97超碰国产公开结果| 一本一本久久a久久精品牛牛影视| 亚洲欧美另类国产| 亚洲精品欧美| 久久成人精品无人区| 亚洲神马久久| 免费观看一级特黄欧美大片| 亚洲欧美日韩精品久久亚洲区 | 亚洲愉拍自拍另类高清精品| 91久久国产精品91久久性色| 亚洲制服欧美中文字幕中文字幕| 亚洲国产福利在线| 欧美一区二区三区播放老司机 | 狠狠色狠狠色综合日日91app| 99国产精品久久久久老师| 一区二区三区在线免费观看| 亚洲——在线| 亚洲一卡久久| 欧美喷潮久久久xxxxx| 蜜桃av一区二区| 国产在线一区二区三区四区 | 欧美va天堂在线| 国内成+人亚洲+欧美+综合在线| 一本久久a久久精品亚洲| 亚洲人成艺术| 久久一区二区三区四区五区| 久久精品成人一区二区三区蜜臀| 国产精品久线观看视频| 亚洲久久一区二区| av不卡免费看| 欧美日韩精品欧美日韩精品| 欧美激情成人在线视频| 在线亚洲激情| 一区二区欧美在线观看| 欧美极品欧美精品欧美视频| 欧美激情中文字幕乱码免费| 在线成人av.com| 久久一区二区三区四区| 欧美h视频在线| 亚洲第一区在线| 嫩草伊人久久精品少妇av杨幂| 欧美成人免费在线| 亚洲国产成人tv| 免费毛片一区二区三区久久久| 欧美二区视频| 亚洲国产高清在线| 欧美激情综合网| 亚洲精品一区二区三区99| 一区二区三区日韩欧美精品| 欧美视频精品在线观看| 亚洲小视频在线观看| 欧美一区二区三区在线视频| 国产一区91| 美女尤物久久精品| 亚洲精品色婷婷福利天堂| 亚洲一区二区免费视频| 国产精品美女久久久久久2018| 亚洲欧美日韩综合国产aⅴ| 久久综合色8888| 亚洲精品欧美极品| 国产精品久久久久久久久久妞妞| 性欧美超级视频| 免费在线成人| 宅男噜噜噜66一区二区 | 欧美+亚洲+精品+三区| 亚洲靠逼com| 欧美一区二区视频在线| 亚洲国产成人久久| 欧美丝袜一区二区| 久久成人免费电影| 亚洲精品乱码久久久久久日本蜜臀| 亚洲一区二区精品在线| 国产综合自拍| 欧美日韩精品免费观看视频完整 | 亚洲欧美国产一区二区三区| 免费在线国产精品| 亚洲一区bb| 在线日韩欧美视频| 国产精品日韩欧美一区二区三区| 久久夜色精品一区| 亚洲一区二区综合| 亚洲黄网站在线观看| 久久国产精品亚洲77777| 亚洲精品日韩激情在线电影 | 欧美日韩国产精品| 久久久久久久久久久久久久一区| 99国产一区二区三精品乱码| 免费成人高清| 欧美呦呦网站| 一区二区三欧美| 亚洲二区免费| 国产一区二区日韩精品| 欧美午夜一区二区| 欧美剧在线免费观看网站| 久久久久五月天| 妖精成人www高清在线观看| 韩日成人在线| 国产乱码精品一区二区三区av| 欧美日本一道本| 噜噜噜噜噜久久久久久91| 欧美专区在线| 午夜精品成人在线| 亚洲图色在线| 一区二区三区欧美在线| 亚洲精一区二区三区| 亚洲成人在线免费| 老牛嫩草一区二区三区日本| 欧美一二区视频| 亚洲一区二区三区激情| 一区二区不卡在线视频 午夜欧美不卡在 | 国产欧美日韩另类一区| 国产精品免费福利| 国产精品乱人伦一区二区 | 欧美精品国产一区二区| 免费成人av| 蜜臀a∨国产成人精品| 噜噜噜噜噜久久久久久91| 美女久久一区| 欧美成人亚洲成人| 欧美成人免费视频| 牛牛影视久久网| 欧美国产精品日韩| 欧美日产在线观看| 欧美日韩国产区| 国产精品播放| 国产一区二区三区四区三区四| 国产亚洲精品一区二555| 国产一区二区欧美| 在线观看一区视频| 亚洲日本va午夜在线电影 | 国产日韩欧美一二三区| 国产一区香蕉久久| 91久久国产自产拍夜夜嗨| 亚洲精品综合精品自拍| 亚洲天堂久久| 午夜精品亚洲| 噜噜噜在线观看免费视频日韩| 欧美成人免费小视频| 日韩一级在线| 午夜免费电影一区在线观看| 久久久亚洲午夜电影| 欧美日韩国产123| 国产精品视频第一区| 激情亚洲网站| 一卡二卡3卡四卡高清精品视频| 亚洲欧美视频| 欧美激情精品久久久久久| 一区二区三区四区精品| 久久婷婷国产综合尤物精品 | 欧美亚洲综合另类| 欧美二区不卡| 国产欧美日韩视频在线观看 | 亚洲欧美视频在线观看| 欧美~级网站不卡| 一本久久综合亚洲鲁鲁| 久久久99国产精品免费| 国产精品v片在线观看不卡| 伊人蜜桃色噜噜激情综合| 亚洲视频一区在线观看| 免费的成人av| 亚洲午夜激情在线| 农夫在线精品视频免费观看| 国产精品jvid在线观看蜜臀 | 黑人操亚洲美女惩罚| 99视频精品免费观看| 老司机凹凸av亚洲导航| 亚洲视频综合| 欧美激情一区二区在线| 精品成人久久| 欧美中日韩免费视频| 日韩小视频在线观看专区| 久久婷婷久久一区二区三区| 国产日韩三区| 午夜天堂精品久久久久 | 麻豆乱码国产一区二区三区|