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