首页 > 代码库 > vc 下和Linux 下的auto_ptr源码剖析

vc 下和Linux 下的auto_ptr源码剖析

技术分享

1.vc
template<class _Ty>
class auto_ptr
{
public:
	typedef _Ty element_type;
	auto_ptr(_Ty *_P = 0) 	: _Owns(_P != 0), _Ptr(_P)
	{}
	//拷贝构造  将_Y的管理权_Owns = false 释放后将指针赋值过去
	auto_ptr(const auto_ptr<_Ty>& _Y) : _Owns(_Y._Owns), _Ptr(_Y.release())
	{}
	auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y) _THROW0()
	{
		if(this != &_Y)//防止字赋值
		{
		   if (_Ptr != _Y.get())
		   {
			   if (_Owns)
				delete _Ptr;//当Owns为真的时候,释放其ptr所指的空间
			   _Owns = _Y._Owns; 
		   }
		   else if (_Y._Owns)
			 _Owns = true;
		   _Ptr = _Y.release();//
		}
		return (*this); 
	}
	~auto_ptr()
	{
	//程序结束时析构函数被调用,释放空间
		if (_Owns)
			delete _Ptr;
	}
	//重载*后,具有和指针相似的访问形式
	_Ty& operator*() const _THROW0()
	{
		return (*get());
	}
	_Ty *operator->() const _THROW0()
	{ 
		return (get()); 
	}
	_Ty *get() const _THROW0()
	{
		return (_Ptr);
	}
	_Ty *release() const _THROW0()//只是将Owns置为false,没有改变指针指向
	{
		((auto_ptr<_Ty> *)this)->_Owns = false;
		return (_Ptr); 
	}
private:
	bool _Owns;
	_Ty *_Ptr;
	};
int main()
{
    	int *p = (int *)malloc(sizeof(int));
	*p = 3;
	
        int *q = (int *)malloc(sizeof(int));
	*q = 5;
	auto_ptr<int> pa(p);
	auto_ptr<int> pb(q);
	pa = pb;
	cout<<*pa<<endl;//此时输出都是5
	cout<<*pb<<endl;//输出5
    return 0;
}
如上图



2.linux
template<class _Ty>
class auto_ptr
{
       public:
                explicit auto_ptr(_Ty *p = 0):_M_Ptr(p)
		{

		}
		~auto_ptr()
		{
		    delete _M_Ptr;
		}
		auto_ptr(auto_ptr<_Ty> &_Y):_M_Ptr(_Y.release())
		{
		}
		_Ty& operator *()
		{
		    return *_M_Ptr;
		}
		_Ty& operator ->()
		{
		    return (*this)->_M_Ptr;
		}
		auto_ptr<_Ty> &operator =(auto_ptr<_Ty> & _Y)//不同之处
		{
                    reset(_Y.release());  
		    return *this;
		}
		_Ty* release()
		{
                     _Ty *_tmp = _M_Ptr;
                     _M_Ptr = 0;//linux下将指针置为空,此时若访问转移权限
		    return _tmp;
		}
		void reset(_Ty *_ptr = 0)//重置对指针的管理
		{
		   _Ty * _pt = _M_Ptr;
                   if(_ptr!=_pt)
		   {
			delete _pt;//先delete掉前指针的空间,避免造成内存泄漏
		   }
                   _M_Ptr = _ptr;
		}
	private:
		_Ty* _M_Ptr;//与vc下不同的是没有权限标志
};

技术分享

pb连访问的机会也失去了。。。。。



如有错误,欢迎前辈们指点,嘿嘿。

vc 下和Linux 下的auto_ptr源码剖析