读书笔记:c++对话系列,auto_ptr源码范式参考

以下源码来自sgi stl,并裁剪了非核心的代码。
关键点在于拷贝构造、赋值函数中,用__a.release()进行所有权转让。

template <class _Tp> class auto_ptr {
private:
  _Tp* _M_ptr;
public:
  typedef _Tp element_type;
  explicit auto_ptr(_Tp* __p = 0) __STL_NOTHROW : _M_ptr(__p) {}
  auto_ptr(auto_ptr& __a) __STL_NOTHROW : _M_ptr(__a.release()) {}
  auto_ptr& operator=(auto_ptr& __a) __STL_NOTHROW {
    if (&__a != this) {
      delete _M_ptr;
      _M_ptr = __a.release();
    }
    return *this;
  }
  ~auto_ptr() { delete _M_ptr; }
  _Tp& operator*() const __STL_NOTHROW {return *_M_ptr;}
  _Tp* operator->() const __STL_NOTHROW {return _M_ptr;}
  _Tp* get() const __STL_NOTHROW {return _M_ptr;}
  _Tp* release() __STL_NOTHROW {
    _Tp* __tmp = _M_ptr;
    _M_ptr = 0;
    return __tmp;
  }
  void reset(_Tp* __p = 0) __STL_NOTHROW {
    if (__p != _M_ptr) {
      delete _M_ptr;
      _M_ptr = __p;
    }
  }
};

你可能感兴趣的:(cpp,c++)