前言
从之前智能指针的介绍中可以了解到智能指针主要作用是管理内存,避免内存泄漏和悬垂指针。
之前介绍的不管是智能指针与引用计数详解还是智能指针与句柄详解,其核心就是通过一个类来管理被new出来的对象,具体的技术就是靠引用计数。
auto_ptr介绍
auto_ptr的实现原理其实就是RAII,在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。该智能指针已经在C++11中被弃用了,已经有更好的unique_ptr来代替。
官网说明:
template class auto_ptr;
Automatic Pointer [deprecated]
Note: This class template is deprecated as of C++11. unique_ptr is a new facility with a similar functionality, but with improved security (no fake copy assignments), added features (deleters) and support for arrays. See unique_ptr for additional information.
auto_ptr特点
1. auto_ptr没有使用引用计数,在复制构造函数和赋值构造函数中将对象所有权转移了。
template<typename _Tp1> auto_ptr(auto_ptr<_Tp1>& __a) throw() : _M_ptr(__a.release()) { }
template<typename _Tp1>auto_ptr& operator=(auto_ptr<_Tp1>& __a) throw()
{
reset(__a.release());
return *this;
}
void reset(element_type* __p = 0) throw()
{
if (__p != _M_ptr)
{
delete _M_ptr;
_M_ptr = __p;
}
}
element_type* release() throw()
{
element_type* __tmp = _M_ptr;
_M_ptr = 0;
return __tmp;
}
因此使用该智能指针的时候要注意:
std::auto_ptr pa(new ClassA());
motherTest(pa); //该函数会导致pa的copy构造函数执行,所有权被转移
pa->…; //调用ClassA对象的方法会crash
2. auto_ptr不能指向数组,因为auto_ptr在析构的时候只是调用delete,而数组应该要调用delete[]。
auto_ptr只有一个私有成员变量_M_ptr
template<typename _Tp> class auto_ptr
{
private:
_Tp* _M_ptr;
// 其它代码省略
}
3.auto_ptr不能和标准容器(vector,list,map…)一起使用。
STL容器中的元素经常要支持拷贝,赋值等操作,在这过程中auto_ptr会传递所有权。
下一章:shared_ptr共享指针详解
扩展:刚才想上传免费资源,但是默认要花费积分,所以直接粘贴出来了,auto_ptr源码参考:
// auto_ptr impleme