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