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連訪問的機會也失去了。。。。。
如有錯誤,歡迎前輩們指點,嘿嘿。