#include <iostream> #include <tr1/memory> using std::tr1::shared_ptr; using std::tr1::weak_ptr; using std::tr1::enable_shared_from_this; class scope:public enable_shared_from_this<scope>{ public: void get_this_shared_ptr(){ shared_from_this(); } }; int main(){ shared_ptr<scope> a(new scope); a->get_this_shared_ptr(); scope *b = new scope; b->get_this_shared_ptr(); return 0; }
创建一个scope,由enabe_shared_from_this派生得到,在scope中获取this的share_ptr,在main函数中,第一二句没问题,第三四句就会有异常出错。
本人查看了enable_shared_from_this的源码,它的构造函数是一个默认构造函数:
template<typename _Tp> class enable_shared_from_this { protected: enable_shared_from_this() { } enable_shared_from_this(const enable_shared_from_this&) { }
里面的数据成员是一个weak_ptr:
mutable weak_ptr<_Tp> _M_weak_this;
那么main中的第一二句,在创建scope的时候,调用的是enable_shared_from_this的默认构造函数,_M_weak_this执行默认初始化,它的类型是weak_ptr,
template<typename _Tp> class weak_ptr { public: typedef _Tp element_type; weak_ptr() : _M_ptr(0), _M_refcount() // never throws { }
weak_ptr执行默认初始化,_M_weak_this里面的元素就是空的。
从一个空的weak_ptr转换到shared_ptr是应该报异常的:
inline shared_count::shared_count(const weak_count& __r) : _M_pi(__r._M_pi) { if (_M_pi != 0) _M_pi->add_ref_lock(); else __throw_bad_weak_ptr(); }
所以第一二句也应该是出现异常的,可事实相反,是正确的,这是为什么?
解决方案
40
在使用 enable_shared_from_this 的子类构造 shared_ptr 时, shared_ptr 的构造函数就会为 enable_shared_from_this 的 weak_ptr 成员赋值