#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 成员赋值