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

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>
            欧美午夜精品久久久久久久| 亚洲国产欧美日韩另类综合| 宅男精品导航| 亚洲国产成人久久综合| 久久婷婷国产综合尤物精品| 精品二区视频| 欧美高清视频| 欧美乱在线观看| 午夜精品短视频| 欧美亚洲在线| 亚洲激情视频在线| 在线一区二区三区做爰视频网站| 国产精品美女久久久免费| 久久精品综合一区| 欧美成人免费va影院高清| 日韩一区二区精品葵司在线| 亚洲午夜久久久| 在线观看日韩www视频免费| 亚洲高清一区二| 国产欧美91| 亚洲国产精品电影在线观看| 国产精品三上| 欧美韩日亚洲| 国产乱码精品一区二区三| 欧美成ee人免费视频| 欧美日韩中文字幕在线视频| 另类天堂视频在线观看| 欧美久色视频| 美女视频黄a大片欧美| 欧美午夜精品| 亚洲成人在线视频播放| 欧美婷婷六月丁香综合色| 看片网站欧美日韩| 国产精品高潮呻吟久久| 欧美高清视频| 国产亚洲欧美日韩一区二区| 亚洲美女在线视频| 亚洲成色精品| 亚洲欧美欧美一区二区三区| 亚洲人屁股眼子交8| 先锋资源久久| 亚洲女人小视频在线观看| 欧美高清hd18日本| 久久xxxx精品视频| 国产精品久久久久高潮| 亚洲国产电影| 亚洲风情在线资源站| 欧美一级一区| 欧美一级理论性理论a| 欧美日本在线| 亚洲成人资源网| 136国产福利精品导航网址应用| 亚洲午夜高清视频| 亚洲视频电影在线| 免费成人高清| 欧美aⅴ一区二区三区视频| 国产精品一区二区三区久久久| 亚洲精品在线观看免费| 日韩视频在线一区二区三区| 欧美二区在线播放| 亚洲激情校园春色| 日韩一区二区精品| 欧美三级电影一区| 亚洲视频999| 亚洲欧美在线看| 国产精品女主播| 亚洲一区在线看| 欧美一区二区大片| 久久久国产亚洲精品| 久久狠狠婷婷| 好看的av在线不卡观看| 久久精品国产欧美亚洲人人爽| 久久久久久久久久久久久久一区 | 久久综合狠狠| 精品成人在线视频| 欧美 日韩 国产精品免费观看| 欧美国产日产韩国视频| 亚洲国产精品免费| 欧美日韩成人在线| 亚洲专区在线视频| 麻豆91精品| 亚洲精品中文字幕在线| 国产精品swag| 久久国产欧美| 亚洲国产一区二区三区a毛片| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 一本高清dvd不卡在线观看| 欧美日韩亚洲一区二区三区在线观看| 一本色道久久综合亚洲精品高清| 亚洲欧美综合网| 一区二区三区在线视频播放| 欧美成人有码| 亚洲免费在线观看视频| 免费观看在线综合| 亚洲午夜精品久久久久久app| 国产精品亚洲成人| 玖玖视频精品| 亚洲专区一区| 亚洲国产一区二区三区在线播| 一区二区三区日韩| 国内精品一区二区三区| 欧美精品在线看| 欧美一区午夜视频在线观看| 亚洲国产精品成人| 久久大综合网| 一区二区高清视频| 在线观看av不卡| 国产精品一区二区三区四区五区| 久久久久国产精品www| 亚洲精品视频一区| 久久视频精品在线| 亚洲一区在线播放| 亚洲精品日本| **网站欧美大片在线观看| 国产精品日韩电影| 欧美日韩mp4| 米奇777在线欧美播放| 亚洲午夜精品17c| 亚洲高清网站| 免费观看日韩av| 久久久欧美精品sm网站| 香蕉成人啪国产精品视频综合网| 99精品视频一区| 国产一区视频在线观看免费| 欧美日韩一区国产| 欧美成人网在线| 久久久国产精品一区二区中文| 亚洲性图久久| 一区二区三区不卡视频在线观看 | 美女主播一区| 久久久久久久999精品视频| 午夜精品久久久久久久| 一本色道**综合亚洲精品蜜桃冫 | 怡红院精品视频| 国产精品一级久久久| 国产精品二区二区三区| 欧美日韩国产精品一区二区亚洲 | 日韩视频一区二区在线观看 | 亚洲字幕在线观看| 亚洲天堂男人| 亚洲一线二线三线久久久| 一区二区三区四区国产精品| 日韩视频永久免费| 亚洲第一天堂av| 亚洲国产精品一区二区第四页av| 国产在线精品一区二区中文| 国产精品影片在线观看| 国产麻豆视频精品| 国产精品av一区二区| 欧美日韩在线观看视频| 欧美日韩日本视频| 欧美天堂在线观看| 国产精品久久久久久久第一福利| 欧美午夜电影完整版| 国产精品―色哟哟| 韩日欧美一区二区| 在线观看欧美激情| 亚洲精品免费观看| 一区二区三区久久网| 亚洲男人第一av网站| 欧美一区激情| 猛干欧美女孩| 亚洲精品日产精品乱码不卡| 一本久道久久综合狠狠爱| 中文精品视频| 亚洲欧美激情一区二区| 久久亚洲二区| 欧美视频免费在线观看| 国产在线拍揄自揄视频不卡99 | 欧美精品一区二区三区在线看午夜 | 久久不射电影网| 久久一日本道色综合久久| 亚洲二区精品| 中文欧美日韩| 久久乐国产精品| 欧美三级在线| 在线观看视频欧美| 亚洲免费视频在线观看| 麻豆av一区二区三区| 日韩视频在线一区二区| 亚洲免费综合| 欧美国产精品专区| 国产亚洲欧美一区在线观看| 亚洲人成在线观看| 欧美在线在线| 亚洲人成人99网站| 久久高清国产| 国产精品豆花视频| 亚洲乱码精品一二三四区日韩在线 | 日韩天堂av| 欧美一区二区三区另类| 欧美第十八页| 亚洲女性裸体视频| 欧美日韩精品一区二区三区四区 | 久久一区二区三区av| 亚洲激情一区二区| 欧美自拍偷拍| 国产精品国产三级欧美二区 | 国产精品一区一区| 亚洲精品偷拍|