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;
}

上圖是下面代碼調試信息。
#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;
};


