C++:智能指针_auto_ptr_vs版本

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值