vc 下和Linux 下的auto_ptr源碼剖析

wKioL1fRPwHRs2w_AAAVLNuRHXM913.png-wh_50

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下不同的是沒有權限標誌
};

wKioL1fRRfqiR9b_AAArKzU3bck981.png-wh_50

pb連訪問的機會也失去了。。。。。



如有錯誤,歡迎前輩們指點,嘿嘿。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章