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

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>
            欧美高清一区| 亚洲国产精品嫩草影院| 亚洲校园激情| 国产精品久久久久久久午夜| 一区二区三区欧美亚洲| 亚洲最新在线| 国产精品久久一卡二卡| 久久精品国产第一区二区三区最新章节| 亚洲一区二区久久| 国产视频观看一区| 麻豆久久精品| 欧美久久在线| 欧美专区在线观看一区| 久久久免费av| 一区二区日韩欧美| 午夜一级久久| 亚洲免费大片| 亚洲自拍16p| 亚洲三级视频在线观看| 亚洲午夜激情在线| 极品裸体白嫩激情啪啪国产精品 | 欧美性色视频在线| 欧美在线视频一区| 免费成人av在线看| 午夜精品久久久| 久久综合一区二区| 亚洲综合欧美日韩| 久久综合精品一区| 午夜精品在线看| 蜜臀a∨国产成人精品| 午夜精品久久久久久久99樱桃 | 一区二区三区精品国产| 激情婷婷久久| 一区二区高清在线观看| 一区一区视频| 亚洲欧美国产77777| 日韩视频精品在线| 久久久91精品国产一区二区精品| 日韩午夜激情av| 羞羞视频在线观看欧美| 99国产精品| 久久综合九色综合久99| 先锋亚洲精品| 欧美日韩在线播放三区| 免费短视频成人日韩| 国产精品综合| 一区二区三区视频在线| 亚洲精品美女免费| 久久精品三级| 久久久精品国产一区二区三区| 欧美日韩1区| 亚洲国产一区二区精品专区| 怡红院av一区二区三区| 欧美尤物巨大精品爽| 亚洲欧美日韩中文播放| 欧美日韩中文精品| 亚洲精品视频二区| 亚洲精品中文字幕在线| 欧美www在线| 欧美国产日韩精品免费观看| 激情亚洲网站| 久久精品理论片| 久久综合狠狠| 国内精品美女av在线播放| 午夜亚洲性色福利视频| 久久不见久久见免费视频1| 国产精品视频在线观看| 亚洲一区二区三区四区中文| 亚洲一区中文字幕在线观看| 欧美婷婷久久| 午夜国产欧美理论在线播放| 翔田千里一区二区| 国产午夜一区二区三区| 久久久久综合网| 亚洲国产精品999| 一道本一区二区| 国产精品sm| 欧美一区二区三区四区夜夜大片| 欧美一区视频在线| 影音先锋一区| 欧美精品入口| 亚洲影院免费| 久久久久久亚洲精品中文字幕 | 国产亚洲欧美一区二区三区| 欧美一级片久久久久久久| 久久艳片www.17c.com| 亚洲国产成人精品久久久国产成人一区| 久久夜色撩人精品| 亚洲精品国产精品国自产在线 | 91久久精品国产91久久| 欧美女同在线视频| 午夜精品久久久久99热蜜桃导演| 久久国产精品亚洲va麻豆| 亚洲第一黄色网| 欧美日本三区| 欧美中文在线观看| 亚洲国产精品激情在线观看| 亚洲一区国产| 亚洲第一视频网站| 欧美网站大全在线观看| 久久精品夜色噜噜亚洲a∨ | 亚洲精品少妇网址| 久久精品国产综合| 日韩一级精品视频在线观看| 国产精品乱码妇女bbbb| 久久免费午夜影院| 99re66热这里只有精品3直播| 久久久久九九九九| 亚洲午夜av在线| 亚洲大胆人体在线| 国产精品麻豆va在线播放| 理论片一区二区在线| 亚洲直播在线一区| 亚洲国产精品999| 久久久国产一区二区| 中文久久乱码一区二区| 在线观看亚洲a| 国产精品系列在线| 欧美日韩在线精品一区二区三区| 久久久久国色av免费看影院 | 欧美激情久久久| 欧美一区二区三区播放老司机| 亚洲精品视频一区| 黑丝一区二区| 国产一区二区日韩精品欧美精品| 欧美日韩视频专区在线播放 | 欧美一区二区视频网站| 亚洲另类视频| 亚洲国语精品自产拍在线观看| 久久九九99视频| 欧美一区二区| 亚洲欧美999| 亚洲一区区二区| 亚洲伦理久久| 亚洲美女在线国产| 亚洲精品影院| 亚洲麻豆国产自偷在线| 亚洲激情电影中文字幕| 在线看视频不卡| 永久免费精品影视网站| 国产欧美精品| 国产欧美在线观看| 国产欧美日韩一区| 国产欧美一区二区精品婷婷| 国产精品青草久久| 国产免费成人av| 国产日韩欧美制服另类| 国产日韩精品一区二区三区| 国产精品性做久久久久久| 国产精品久久久久久久久久三级| 欧美日韩中文字幕精品| 国产精品久久999| 国产精品亚洲综合| 国产亚洲一级| 亚洲国产精品激情在线观看| 亚洲国产精品久久久久秋霞蜜臀| 亚洲七七久久综合桃花剧情介绍| 91久久国产综合久久| 99国产精品久久久久久久久久 | 亚洲视频 欧洲视频| 亚洲一区视频| 久久国产精品一区二区三区四区| 久久国产精品高清| 老色鬼精品视频在线观看播放| 免费看成人av| 亚洲日本成人网| 亚洲一区二区三区高清 | 久久久久9999亚洲精品| 久久精品在线观看| 欧美激情一区二区| 国产精品毛片大码女人| 极品av少妇一区二区| 亚洲精品四区| 欧美一区二区三区视频在线观看| 久久综合一区| 日韩亚洲欧美在线观看| 欧美专区在线播放| 欧美裸体一区二区三区| 国产精品夜夜嗨| 亚洲精品自在在线观看| 久久超碰97中文字幕| 欧美黄色片免费观看| 亚洲一区二区av电影| 免费在线欧美视频| 国产情人节一区| 亚洲理论在线| 久久免费视频网| 一本色道久久综合| 毛片基地黄久久久久久天堂 | 久久一区二区三区超碰国产精品 | 午夜在线a亚洲v天堂网2018| 欧美不卡在线| 国语精品一区| 亚洲欧美日韩视频一区| 亚洲品质自拍| 久久亚洲精选| 国产亚洲综合精品| 亚洲欧美日本在线| 亚洲激情在线视频| 久久久综合视频|