浅谈auto_ptr

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


猜你喜欢

转载自blog.csdn.net/zzb2019/article/details/79077291