智能指针之auto_ptr源码剖析

//自动指针即auto_ptr,不同于scoped_ptr指针的是自动指针会转移使用权
//在进行赋值或者拷贝构造之后,原来的auto_ptr会失去对所管指针的拥有权,并且将自己的指针赋为NULL
//同时,在赋值和拷贝构造之后,原来的auto_ptr的指针会指向NULL,也是它最大的弊端之一
//因为这和我们通常所理解的copy非常不同,所以<span style="color: rgb(34, 34, 34); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px;">Google C++ Style提到 scoped_ptr已经足够好了,必要时可以使用share_ptr但永远不要使用auto_ptr</span>
//而且std::auto_ptr在c++11中已经被声明为弃用
//重点是赋值操作符的写法,考虑多种不同的情况
#include <iostream>

using namespace std;

template <class _Ty> 
class auto_ptr
{
private :	
	mutable bool _Owns;
	mutable _Ty  *_Ptr;

public :
	auto_ptr(_Ty *_P = 0) : _Owns(_P != 0), _Ptr(_P){}
	auto_ptr(const auto_ptr<_Ty>& _Y);
	auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y);
	~auto_ptr();
	_Ty operator*() const;
	_Ty * operator->() const;
	_Ty * get() const;
	_Ty * release() const;
};

template <class _Ty>
_Ty* auto_ptr<_Ty> :: get() const
{return _Ptr;}

template <class _Ty>
_Ty auto_ptr<_Ty> :: operator*() const
{return *get();}

template <class _Ty>
_Ty* auto_ptr<_Ty> :: operator->() const
{return get();}

template <class _Ty>
auto_ptr<_Ty> :: ~auto_ptr()
{
	if(_Owns)
		delete _Ptr;
}

template <class _Ty>
_Ty* auto_ptr<_Ty> :: release() const
{
	_Owns = 0;
	_Ty * temp = _Ptr;
	_Ptr = NULL;	
	return temp;
}

template <class _Ty>
auto_ptr<_Ty> :: auto_ptr(const auto_ptr<_Ty>& _Y)
{
	_Ptr = _Y._Ptr;
	_Owns = 1;
	_Y.release();
}

//重点
template <class _Ty>
auto_ptr<_Ty>& auto_ptr<_Ty> :: operator=(const auto_ptr<_Ty>& _Y)
{
	if(this != &_Y)
	{
		if(_Ptr != _Y.get())	
		{
			if(_Owns)	
				delete _Ptr;
			_Owns = _Y._Owns;
		}
		else if(_Y._Owns)
			_Owns = true;
		_Ptr = _Y.release();
	}
	return (*this);
}

int main()
{
	int *p = new int(19);
	auto_ptr<int> ap(p);
	auto_ptr<int> ap2;
	cout << *ap << endl;
	ap2 = ap;
	if(ap2.get() == NULL)
		cout << "ap2 == NULL" << endl;
	else 
		cout << *ap2 << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值