c++的auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理。
使用std::auto_ptr,要#include <memory>。 [1]
<dl></dl>
<dd>自动指针</dd>
<dd>auto_ptr</dd>
编辑
在c++中, auto_ptr是一个类,它用来实现对动态分配对象的自动释放。
它的源代码:
template < class t>
class auto_ptr
{
private :
t*ap;
public :
//constructor & destructor-----------------------------------(1)
explicit auto_ptr(t*ptr=0) throw ():ap(ptr)
{
}
~auto_ptr() throw ()
delete ap;
//copy & assignment--------------------------------------------(2)
auto_ptr(auto_ptr& rhs) throw ():ap(rhs.release())
template < class y>
auto_ptr(auto_ptr<y>&rhs) throw ():ap(rhs.release())
auto_ptr& operator=(auto_ptr&rhs) throw ()
reset(rhs.release());
return * this ;
auto_ptr& operator=(auto_ptr<y>&rhs) throw ()
//dereference----------------------------------------------------(3)
t& operator*() const throw ()
return *ap;
t* operator->() const throw ()
returnap;
//helper functions------------------------------------------------(4)
//value access
t* get() const throw ()
//release owner ship
t* release() throw ()
t*tmp(ap);
ap=0;
return tmp;
//reset value
void reset(t*ptr=0) throw ()
if (ap!=ptr)
{
deleteap;
ap=ptr;
}
//special conversions-----------------------------------------------(5)
struct auto_ptr_ref
y*yp;
auto_ptr_ref(y*rhs):yp(rhs){}
};
auto_ptr(auto_ptr_ref<t>rhs) throw ():ap(rhs.yp)
auto_ptr& operator=(auto_ptr_ref<t>rhs) throw ()
reset(rhs.yp);
operator auto_ptr_ref<y>() throw ()
returnauto_ptr_ref<y>(release());
operator auto_ptr<y>() throw ()
returnauto_ptr<y>(release());
};
1
2
3
4
5
6
7
8
(0));
auto_ptr<int>(new int(0))是一个临时对象,同时是一个右值,一般的 拷贝构造函数当然能拷贝右值,因为其参数类别必须为一个const reference, 但是我们知道,auto_ptr的拷贝函数其参数类型为reference,所以,为了使这行代码能通过,我们引入auto_ptr_ref来实现从右值向 左值的转换。其过程为:
1) ap1要通过拷贝 auto_ptr<int>(new int(0))来构造自己
2) auto_ptr<int>(new int(0))作为右值与现有的两个拷贝构造函数参数类型都无法匹配,也无法转换成该种参数类型
3) 发现辅助的 拷贝构造函数auto_ptr(auto_ptr_ref<t> rhs) throw()
4) 试图将auto_ptr<int>(new int(0))转换成auto_ptr_ref<t>
5) 发现 类型转换函数operator auto_ptr_ref<y>() throw(),转换成功。
6)调用auto_ptr(auto_ptr_ref<t>rhs)throw()完成auto_ptr_ref向auto_ptr的构造。
从而通过一个间接类成功的实现了拷贝构造右值(临时对象)
同时,这个辅助方法不会使const auto_ptr被拷贝, 原因是在第5步, 此类型转换函数为non-const的,我们知道,const对象是无法调用non-const成员的, 所以转换失败。当然, 这里有一个问题要注意, 假设你把这些辅助转换的代码注释掉,该行代码还是可能成功编译,这是为什么呢?debug一下, 我们可以发现只调用了一次 构造函数,而 拷贝构造函数并没有被调用,原因在于 编译器将 代码优化掉了。这种类型优化叫做returned value optimization,它可以有效防止一些无意义的临时对象的构造。当然,前提是你的编译器要支持returned value optimization。
<dd></dd>
1. c++参考手册auto_ptr .cplusplus(c++)[引用日期2015-02-15]