源码及注释如下,这比记忆语法好多了!个人认为,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,两者都兼容其它标准库组件,因此你可以在标准容器内安全保存这些智能指针,并使用标准算法操作它们。"