auto_ptr源码剖析

// TEMPLATE CLASS auto_ptr
template<class _Ty>
class auto_ptr {
public:

       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); } //如果拷贝自身,则返回自身

       ~auto_ptr()

              {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); }

private:

       bool _Owns;

       _Ty *_Ptr;

       };

我所贴出来的是VC6中的实现,与Scott Meyers给出的源码相比,存在这样一些不同,首先这个实现没有关于Reset函数的实现,第二,与Meyers不同,VC6判断auto_ptr是否拥有内部指针对象的所有权是根据一个bool变量而不是根据指针的值是否为NULL。A、auto_ptr需要保证内部不抛出异常,显然函数作了异常规则的限定,但在实现过程中,尤其要注意可能导致异常的地方。

auto_ptr看上去似乎不错,但我不建议使用,在我看来没有看出它带来的好处多到我们可以避讳它可能带来的代码上的疏忽。对于auto_ptr来说,对象一经拷贝就丧失了内部指针对象的所有权。我的看法,慎用auto_ptr。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值