auto_ptr是一种智能指针(smart pointer),可以有效的防止"被异常抛出时候发生的资源泄露"。auto_ptr只能解决一些特定问题,对于其他问题还有其他的智能指针实现。
auto_ptr存在的意义就是为了使程序变的简洁,同时消除了出现new 就必须存在delete的问题,它应该保证无论在何种情况下,只要自己被摧毁,就一定连带释放其所指向资源。auto_ptr是这样一种指针:它拥有它所指向的对象,所有当其自身被摧毁时,该对象也将遭到摧毁,他要求一个对象只能有一个拥有者,严禁一物二主。使用它的好处就是不再需要delete,也不需要catch。auto_ptr的接口 与一般指针十分相似,通过重载运算符“*”来提领其所指向的对象,“->”来指向对象中的成员,同时并没有重载“++”、“-”运算符,避免了不必要的麻烦。需要注意的是auto_pt<>不允许使用一般指针惯用的赋值(assign)初始化方式,故必须直接使用数值来完成初始化。
#include<iostream>
using namespace std;
template<class _Ty>
class auto_ptr
{
typedef auto_ptr<_Ty> _Myt;
public:
auto_ptr(_Ty *_Ptr = 0):_Myptr(_Ptr){}
auto_ptr(_Myt& _Right):_Myptr(_Right.release()){}
_Myt& operator=(_Myt& _Right)
{
reset(_Right.release());
return(*this);
}
void reset(_Ty *_Ptr = 0)
{
if(_Ptr != _Myptr) //若果_Ptr指向与原_Myptr指向不同
delete _Myptr; //则释放_Mypt
_Myptr = _Ptr;//让新的_Ptr 指向原_Myptr所指向的空间
}
~auto_ptr(){delete _Myptr;}
public:
_Ty& operator*()const{return (*get());}
_Ty* operator->()const{return (get());}
_Ty* get()const
{
return (_Myptr);
}
_Ty *release()
{
_Ty *_Tmp = _Myptr;//创建一个新的模板类型指针指向现有的_Myptr
_Myptr = 0;
return (_Tmp);
}
private:
_Ty *_Myptr;
};
void main()
{
int *a = new int(521);
auto_ptr<int> pa(a);
cout<<*pa<<endl;
auto_ptr<int> pd = pa;
cout<<*pd<<endl;
//cout<<*pa<<endl;
}