Code Bye

c++关于智能指针的问题

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

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c++关于智能指针的问题