智能指针:是存储指向动态分配对象指针的类。能够在适当的时间自动删除指向的对象。

下面是它的三种实现:

//autoptr
template
class Autoptr
{
public:
	Autoptr(T* ptr)
		:_ptr(ptr)
	{}
	~Autoptr()
	{
		if(_ptr)
		{
			delete _ptr;
			_ptr = NULL;
		}
	}
	AutoPtr(const AutoPtr& ap)
	{
		_ptr = ap._ptr;
		ap._ptr = NULL;
	}
	AutoPtr& operator=(const AutoPtr& ap) 
	{
		if(this != &ap)
		{
			if(_ptr && _ptr!=ap._ptr)
				delete _ptr;
			_ptr = ap._ptr;
			ap._ptr = NULL;
		}
		return *this;
	}
	T& operator*()
	{
		assert(_ptr);
		return *_ptr;
	}
	T* operator->()
	{
		return _ptr;
	}
	T* Getptr()
	{
		return _ptr;
	}
	bool operator=(const AutoPtr& ap)
	{
		if(ap._ptr == _ptr)
			return true;
		else
			return false;
	}
private:
	T* _ptr;
};

//scopedptr
template
class Scopedptr
{
public:
	Scopedptr(T* ptr)
		:_ptr(ptr)
	{}
	~Scopedptr()
	{
		if(_ptr)
		{
			delete _ptr;
			_ptr = NULL;
		}
	}
	T& operator*()
	{
		return *_ptr;
	}
	T* operator->()
	{
		return _ptr;
	}
	T* Getptr()
	{
		return _ptr;
	}
	Scopedptr(const Scopedptr& ap);  //只声明不实现
	Scopedptr& operator=(const Scopedptr& ap);
private:
	T* _ptr;

};
//引用计数
template
class Sharedptr
{
public:
	Sharedptr(T* ptr)
		:_ptr(ptr)
		,_count(new int(1))
	{}
	~Sharedptr()
	{
		if(_ptr)
		{
			_Release();
			_ptr = NULL;
			_count = NULL;
		}
	}
	SharedPtr(SharedPtr& sp)
		:_ptr(sp._ptr)
		,_count(sp._count)
	{
		
		(*_count)++;
	}
	SharedPtr& operator=(const SharedPtr& sp)
	{
		if(this != &ap)
		{
			_Release();
			_ptr = sp._ptr;
			_count = sp._count;
			(*_count)++;
		}
		return *this;
	}
private:
	void _Release()
	{
		if((*_count)-- == 0)
		{
			delete _count;
			delete _ptr;
		}
	}
private:
	T* _ptr;
	int* _count;
};