typedef _Ty element_type;
explicit auto_ptr(_Ty *_P = 0) _THROW0()
: _Owns(_P != 0), _Ptr(_P) {}
auto_ptr(const auto_ptr<_Ty>& _Y) _THROW0()
: _Owns(_Y._Owns), _Ptr(_Y.release()) {}
auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y) _THROW0()
{if (this != &_Y)
{if (_Ptr != _Y.get())//如果内置指针指向对象不同,则改变所有权
{if (_Owns) //释放自身拥有的指针对象
delete _Ptr;
_Owns = _Y._Owns; }
else if (_Y._Owns)//如果内置指针指向对象相同,则改变所有权
_Owns = true;
_Ptr = _Y.release(); }
return (*this); } //如果拷贝自身,则返回自身
{if (_Owns)
delete _Ptr; }
_Ty& operator*() const _THROW0()
{return (*get()); }
_Ty *operator->() const _THROW0()
{return (get()); }
_Ty *get() const _THROW0()
{return (_Ptr); }
_Ty *release() const _THROW0()
{((auto_ptr<_Ty> *)this)->_Owns = false;
return (_Ptr); }
bool _Owns;
_Ty *_Ptr;
我所贴出来的是VC6中的实现,与Scott Meyers给出的源码相比,存在这样一些不同,首先这个实现没有关于Reset函数的实现,第二,与Meyers不同,VC6判断auto_ptr是否拥有内部指针对象的所有权是根据一个bool变量而不是根据指针的值是否为NULL。A、auto_ptr需要保证内部不抛出异常,显然函数作了异常规则的限定,但在实现过程中,尤其要注意可能导致异常的地方。