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

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>
            久久精品123| 亚洲免费观看在线视频| 久久国内精品视频| 麻豆精品视频在线观看| 亚洲国产精品嫩草影院| 欧美国产视频日韩| 一区二区三区免费观看| 久久精品99无色码中文字幕| 韩国一区二区三区在线观看| 男女激情视频一区| 亚洲美女少妇无套啪啪呻吟| 欧美亚洲免费高清在线观看| 国产专区欧美精品| 模特精品在线| 亚洲一区二区三区精品在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲黄色有码视频| 欧美午夜电影网| 久久欧美肥婆一二区| 亚洲伦伦在线| 久久免费视频观看| 99热精品在线| 国内精品美女av在线播放| 欧美大片一区二区三区| 亚洲一区二区三区精品动漫| 欧美超级免费视 在线| 亚洲一区二区三区视频| 在线高清一区| 国产精品wwwwww| 六月丁香综合| 亚洲欧美在线高清| 日韩视频免费观看| 麻豆精品一区二区综合av| 在线亚洲一区观看| 好看的av在线不卡观看| 欧美午夜片在线免费观看| 久久久精品日韩| 亚洲一区三区在线观看| 欧美激情按摩| 久久精品综合| 销魂美女一区二区三区视频在线| 亚洲经典在线| 国产一区二区中文字幕免费看| 欧美日韩久久| 欧美大片第1页| 麻豆精品视频| 久久精品国产99国产精品| 亚洲图片欧洲图片av| 91久久精品国产91久久性色tv| 午夜精品久久久久久久久久久久久| 亚洲欧洲在线观看| 国产午夜精品在线| 国产精品r级在线| 欧美日韩视频在线一区二区观看视频 | 国产精品一区二区三区四区 | 亚洲在线观看免费| 欧美黄色aaaa| 久热re这里精品视频在线6| 欧美一区2区视频在线观看| 亚洲最黄网站| 亚洲精品一区二区三| 亚洲高清免费在线| 亚洲二区免费| 亚洲福利一区| 一区精品在线| 国产一区二区三区在线观看视频| 国产欧美日韩视频一区二区| 国产精品videossex久久发布| 欧美三区免费完整视频在线观看| 欧美成人精品不卡视频在线观看 | 亚洲裸体在线观看| 亚洲经典一区| 亚洲日本aⅴ片在线观看香蕉| 欧美激情一级片一区二区| 美女视频黄a大片欧美| 美女脱光内衣内裤视频久久网站| 久久免费99精品久久久久久| 久久综合久久综合久久综合| 久久综合网hezyo| 欧美成人综合在线| 欧美激情精品久久久久久久变态| 欧美黄在线观看| 亚洲日本成人网| 一区二区三区成人精品| 亚洲一区美女视频在线观看免费| 亚洲综合色噜噜狠狠| 亚洲欧美制服另类日韩| 久久精品国产欧美激情| 另类综合日韩欧美亚洲| 欧美久久久久久久久| 欧美视频在线观看免费网址| 国产精品久久久久久av福利软件| 国产精品日韩精品欧美在线| 国产一区二区日韩精品欧美精品| 一区一区视频| 亚洲精品在线观看视频| 亚洲午夜电影网| 久久av一区| 欧美黄色日本| 夜夜夜久久久| 欧美资源在线| 欧美大色视频| 国产欧美精品日韩区二区麻豆天美| 国产综合色在线| 亚洲伦理久久| 久久成人18免费网站| 欧美大片免费| 亚洲午夜免费视频| 久久精品人人爽| 欧美激情综合色| 国产精品一区二区在线观看| 亚洲高清三级视频| 亚洲欧美日韩视频一区| 久久综合99re88久久爱| 亚洲精品乱码久久久久久| 亚洲天堂男人| 麻豆久久精品| 国产欧美亚洲日本| 日韩香蕉视频| 久久精品首页| 一本久久a久久免费精品不卡| 欧美制服丝袜第一页| 欧美日韩不卡| 亚洲大胆女人| 欧美在线综合视频| 亚洲激情综合| 久久网站免费| 国产精品午夜电影| 亚洲美女中文字幕| 久久中文字幕一区| 亚洲小说春色综合另类电影| 免费久久99精品国产| 国产欧美日韩在线 | 中文在线不卡视频| 欧美xart系列高清| 国产亚洲欧美一区| 亚洲一区二区在线视频| 亚洲国产精品专区久久| 久久精品国产亚洲5555| 国产精品久久久久久妇女6080| 亚洲人体一区| 免费日韩av电影| 久久国产手机看片| 国产精品午夜在线观看| 一区二区三区免费看| 亚洲高清视频在线观看| 久久久久九九视频| 国产一区二区三区四区hd| 午夜视黄欧洲亚洲| 一本色道久久| 欧美日韩精品一区二区| 亚洲人成艺术| 亚洲福利在线视频| 欧美~级网站不卡| 最新中文字幕亚洲| 欧美成人在线网站| 蜜臀va亚洲va欧美va天堂| 永久免费精品影视网站| 卡一卡二国产精品| 久久精品中文字幕一区二区三区| 国产人成精品一区二区三| 小黄鸭精品密入口导航| 亚洲伊人一本大道中文字幕| 国产精品av久久久久久麻豆网| 亚洲香蕉视频| 一本色道久久综合狠狠躁篇怎么玩 | 黄色亚洲大片免费在线观看| 欧美在线播放一区| 午夜国产一区| 国产一区二区毛片| 久久女同互慰一区二区三区| 久久久久国产精品一区| 狠狠色丁香婷综合久久| 美女精品国产| 免费成人高清| 99re6这里只有精品| 亚洲精品日产精品乱码不卡| 欧美日韩免费高清| 夜夜嗨av一区二区三区四区| av成人免费| 国产女人18毛片水18精品| 久久精品人人做人人爽电影蜜月| 久久国产精品99久久久久久老狼 | 国产精品国产三级国产普通话三级| 亚洲视频综合| 午夜精品久久久久久久99水蜜桃| 国产在线不卡| 亚洲国产精品毛片| 欧美性生交xxxxx久久久| 欧美主播一区二区三区| 麻豆精品视频在线观看| 在线亚洲一区二区| 欧美一区亚洲二区| 亚洲国产91色在线| 日韩午夜高潮| 国产在线观看一区| 亚洲国产成人久久综合一区| 国产精品乱码一区二三区小蝌蚪| 久久精品中文字幕一区| 欧美黑人在线播放|