代碼來源:SGI STL
template <class _Tp> class auto_ptr {
private:
_Tp* _M_ptr; //實(shí)際wrap的指針
public:
typedef _Tp element_type;
// 顯示構(gòu)造函數(shù)以故,防止auto_ptr<A> pAObj1 = new A();隱士構(gòu)造
explicit auto_ptr(_Tp* __p = 0) __STL_NOTHROW : _M_ptr(__p) {}
// 復(fù)制構(gòu)造函數(shù)次洼,知道為什么參數(shù)是&嗎戚揭?
auto_ptr(auto_ptr& __a) __STL_NOTHROW : _M_ptr(__a.release()) {}
template <class _Tp1> auto_ptr(auto_ptr<_Tp1>& __a) __STL_NOTHROW
: _M_ptr(__a.release()) {}
// 賦值構(gòu)造函數(shù)
auto_ptr& operator=(auto_ptr& __a) __STL_NOTHROW {
if (&__a != this) {
delete _M_ptr;
_M_ptr = __a.release();
}
return *this;
}
template <class _Tp1>
auto_ptr& operator=(auto_ptr<_Tp1>& __a) __STL_NOTHROW {
if (__a.get() != this->get()) {
delete _M_ptr;
_M_ptr = __a.release();
}
return *this;
}
~auto_ptr() { delete _M_ptr; }
// 智能指針一般都要重載"*"和"->"操作符
_Tp& operator*() const __STL_NOTHROW {
return *_M_ptr;
}
_Tp* operator->() const __STL_NOTHROW {
return _M_ptr;
}
_Tp* get() const __STL_NOTHROW {
return _M_ptr;
}
_Tp* release() __STL_NOTHROW {
_Tp* __tmp = _M_ptr;
_M_ptr = 0;
return __tmp;
}
void reset(_Tp* __p = 0) __STL_NOTHROW {
if (__p != _M_ptr) {
delete _M_ptr;
_M_ptr = __p;
}
}
};
閱讀代碼就會(huì)發(fā)現(xiàn)雕旨,auto_ptr不能共享內(nèi)存搓译,在同一時(shí)間悲柱,只有一個(gè)auto_ptr指向一個(gè)指定的內(nèi)存。