智能指针_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