源碼及註釋如下,這比記憶語法好多了!個人認爲,auto_ptr類設計地不行,比如都不能作爲參數傳遞(傳遞後實參就沒用了),失去了C指針的經典優勢!
// auto_ptr類的簡化版,刪除了有關auto_ptr_ref及auto_ptr<_Other>的一些成員函數
template<class ElemType>
class auto_ptr
{
public:
typedef auto_ptr<ElemType> ClassType;
explicit auto_ptr(ElemType *_Ptr = 0) _THROW0()
: p(_Ptr) // 若有實參,則必須直接初始化,因爲參數是指針,避免隱式轉換
{
}
auto_ptr(ClassType& _Right) _THROW0() // 複製構造函數
: p(_Right.release()) // 形參是引用類型,參數釋放(置爲NULL,成爲未綁定的),轉移所有權
{
}
ElemType *release() _THROW0()
{
ElemType *_Tmp = p;
p = 0; // 1、使自己成爲未綁定的
return (_Tmp); // 2、返回自己所保存的指針
}
void reset(ElemType *_Ptr = 0)
{
if (_Ptr != p) // 如果_Ptr與自己保存的指針值不同,
delete p; // 3、則刪除p指向的對象,
p = _Ptr; // 這句最好也放到if裏 // 4、且將_Ptr綁定到p
}
ClassType& operator=(ClassType& _Right) _THROW0() // 重載賦值運算符
{
reset(_Right.release()); // 注意形參是引用類型,過程見上面的1、2、3、4
return (*this);
}
~auto_ptr()
{
delete p; // 自動調用delete,所以不能綁定到動態分配的數組,是個缺陷。
}
ElemType *get() const _THROW0()
{
return (p); // 返回自己保存的指針
}
ElemType *operator->() const _THROW0() // 返回保存的指針
{ // 還有待研究
#if _ITERATOR_DEBUG_LEVEL == 2
if (p == 0)
_DEBUG_ERROR("auto_ptr not dereferencable");
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
return (get()); // 爲什麼不直接return p?
}
ElemType& operator*() const _THROW0()
{ // 返回所綁定對象的引用
#if _ITERATOR_DEBUG_LEVEL == 2
if (p == 0)
_DEBUG_ERROR("auto_ptr not dereferencable");
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
return (*get()); // 爲什麼不直接return *p?
}
private:
ElemType *p; // 保存的指針
};
以上源碼是Plauger寫的,他是專門寫庫的。
2012/12/27
C++之父談新的智能指針類:
"C++98只定義了一個智能指針類auto_ptr,它現在已經被廢棄了,C++11引入了新的智能指針類shared_ptr和最近添加的unique_ptr,兩者都兼容其它標準庫組件,因此你可以在標準容器內安全保存這些智能指針,並使用標準算法操作它們。"