auto_ptr是一种智能指针(smart pointer),用来自动分配对象并且当不再需要对象时进行自动销毁。
一个典型的例子就是运用new 和delete来产生和销毁对象。
Void tem()
{
classA * ptr=new classA;
…
delete ptr;
}
显而易见的问题是我们经常忘记delete动作,特别是当函数中存在return语句的时候更是如此。而更麻烦的是,即使没有忘记delete,如果程序在delete之前发生异常,函数将立刻退出,根本不会调用函数尾端的delete。防止方法就是捕捉所有异常,但这绝不是一个好方法,这样会把代码搞得很乱,又缺少美观性。
这时,我们可以使用智能指针来处理此类问题。
智能指针可以保证,无论在什么情况下,只要自己被摧毁,就一定连带释放其所指资源。并且由于智能指针本身就是区域变量,无论正常退出与否,只要函数结束,它一定就会被销毁。
auto_ptr是这样一种指针,它是“它所指向的对象”的拥有者,所以auto_ptr被销毁时,该对象也遭到销毁。
template<typename Type>
class auto_ptr
{
public:
auto_ptr(T *p =NULL) :Ptr(p)
{ }
~auto_ptr()
{
delete Ptr;
}
private:
Type *Ptr;
};
void ProcessAdoption(istream &data)
{
while (data)
{
auto_ptr<ALA> pa(readALADara(data));
pa->DealProcessAdoption(data);
}
return;
}
这里不需要delete,也不需要try和catch。
auto_ptr接口与一般指针类似。“*”用来提取所指对象,“->”用于指向对象中的成员。
auto_ptr 注意事项 :
1、auto_ptr不能共享所有权,即绝对不允许一个auto_ptr同时拥有多个对象的情况。
2、auto_ptr不能指向数组,因为auto_ptr是透过delete而非delete[]来释放其拥有的对象的。
3、auto_ptr不能作为容器的成员。因为在copy和assign动作之后,原本的auto_ptr和新产生的auto_ptr并不相等,发生了所谓的所有权转移现象。
4、不能通过赋值操作来初始化auto_ptr
std::auto_ptr<int> p(new int(42)); //OK
std::auto_ptr<int> p = new int(42); //ERROR
这是因为auto_ptr 的构造函数被定义为了explicit
5、若将autp_ptr作为函数参数,应使用const std::auto_ptr<T> Ptr(T)以防止不经意间转换指针的拥有权。这里const并非意味着你不能更改auto_ptr所指的对象,而是你不能更改auto_ptr的拥有权。就常数特性而言,const auto_ptr类似于T * const p,而非const t *p。