智能指针_auto_ptr_vs版本:
<span style="font-size:18px;">#include <iostream> #include <memory> using namespace std; template <class _Ty> class auto_ptr { public: auto_ptr(_Ty *_P = 0):_ptr(_P) {} auto_ptr(auto_ptr<_Ty>& _Y):_ptr(_Y.release()) //让新的指针指向原来的空间,原来的指针赋NULL {} auto_ptr<_Ty>& operator=(auto_ptr<_Ty>& _Y) { if(this != &_Y) { reset(_Y.release()); //将旧指针释放,重新设置新指针的指向 } return (*this); } ~auto_ptr() { delete _ptr; } public: _Ty& operator*()const //重载 *p { return *(get()); } _Ty* operator->()const //重载 p-> { return (get()); } _Ty* get()const //得到指针 { return (_ptr); } _Ty* release() //返回指针,将自身指针赋为NULL { _Ty *_Tmp = _ptr; _ptr = NULL; return (_Tmp); } void reset(_Ty* _P = 0) //重新设置新指针的指向 { if(_P != _ptr && _ptr != 0) delete _ptr; _ptr = _P; } private: _Ty *_ptr; }; int main() { int *p = new int(10); auto_ptr<int> pa(p); cout<<*pa<<endl; auto_ptr<int> pa1 = pa; //调用拷贝构造函数,将指针的拥有权进行转移 cout<<*pa1<<endl; auto_ptr<int> pa2; pa2 = pa1; cout<<*pa2<<endl; return 0; }</span> pa1 _ptr ----->[10] pa2 _ptr ----->[20] void reset(_Ty* _P = 0) { if(_P != _ptr && _ptr != 0) delete _ptr; //将pa2对象的指针所指的空间释放, _ptr = _P; //将pa1的指针赋值给pa2 }
pa2 = pa1; pa2有指向且不是指向pa1指向的空间时,需要先将pa2对象的指针所指的空间释放,然后将pa1的指针赋值给pa2