auto_ptr 源码

template<class _Ty>
 class auto_ptr
  { // wrap an object pointer to ensure destruction
public:
 typedef _Ty element_type;

 explicit auto_ptr(_Ty *_Ptr = 0) _THROW0()
  : _Myptr(_Ptr)
  { // construct from object pointer
  }

 auto_ptr(auto_ptr<_Ty>& _Right) _THROW0()
  : _Myptr(_Right.release())
  { // construct by assuming pointer from _Right auto_ptr
  }

 auto_ptr(auto_ptr_ref<_Ty> _Right) _THROW0()
  : _Myptr(_Right._Ref.release())
  { // construct by assuming pointer from _Right auto_ptr_ref
  }

 template<class _Other>
  operator auto_ptr<_Other>() _THROW0()
  { // convert to compatible auto_ptr
  return (auto_ptr<_Other>(*this));
  }

 template<class _Other>
  operator auto_ptr_ref<_Other>() _THROW0()
  { // convert to compatible auto_ptr_ref
  return (auto_ptr_ref<_Other>(*this));
  }

 template<class _Other>
  auto_ptr<_Ty>& operator=(auto_ptr<_Other>& _Right) _THROW0()
  { // assign compatible _Right (assume pointer)
  reset(_Right.release());
  return (*this);
  }

 template<class _Other>
  auto_ptr(auto_ptr<_Other>& _Right) _THROW0()
  : _Myptr(_Right.release())
  { // construct by assuming pointer from _Right
  }

 auto_ptr<_Ty>& operator=(auto_ptr<_Ty>& _Right) _THROW0()
  { // assign compatible _Right (assume pointer)
  reset(_Right.release());
  return (*this);
  }

 auto_ptr<_Ty>& operator=(auto_ptr_ref<_Ty>& _Right) _THROW0()
  { // assign compatible _Right._Ref (assume pointer)
  reset(_Right._Ref.release());
  return (*this);
  }

 ~auto_ptr()
  { // destroy the object
  delete _Myptr;
  }

 _Ty& operator*() const _THROW0()
  { // return designated value
  return (*_Myptr);
  }

 _Ty *operator->() const _THROW0()
  { // return pointer to class object
  return (&**this);
  }

 _Ty *get() const _THROW0()
  { // return wrapped pointer
  return (_Myptr);
  }

 _Ty *release() _THROW0()
  { // return wrapped pointer and give up ownership
  _Ty *_Tmp = _Myptr;
  _Myptr = 0;
  return (_Tmp);
  }

 void reset(_Ty* _Ptr = 0)
  { // destroy designated object and store new pointer
  if (_Ptr != _Myptr)
   delete _Myptr;
  _Myptr = _Ptr;
  }

private:
 _Ty *_Myptr; // the wrapped object pointer
 }; 

C标准库中的智能指针主要有4个,分别是auto_ptr、unique_ptr、shared_ptr和weak_ptrauto_ptr是C++98标准中最早提出的智能指针,但在C++11之后不建议使用。了解auto_ptr源码可以帮助我们更好地理解智能指针的原理和使用。智能指针的实现涉及模板类、函数对象、操作符重载以及其他C++技术的综合运用,它解决了C程序员在内存管理方面的困扰。想要更清晰地了解智能指针的内部原理以及更好地使用它,看一下源码是很有必要的。 智能指针还提供了一个get()函数,用于返回智能指针管理的对象的普通指针。这个函数的存在是为了向不能使用智能指针的代码传递普通指针。例如,我们可以使用std::shared_ptr<int> p1 = std::make_shared<int>(1024)创建一个智能指针,然后通过p1.get()获取其所管理对象的普通指针,即int* p2 = p1.get()。 智能指针是C++标准库中的一个重要组成部分。它帮助C++程序员解决了内存开辟和释放的问题,使得程序员不再像C语言一样担心内存泄漏的问题。使用智能指针需要包含头文件#include <memory>。 在使用智能指针时,应避免混用普通指针和智能指针。例如,在一个函数中,我们应该避免在参数中使用智能指针,然后又将其传递给接受普通指针的函数。这样的混用可能导致内存管理问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值