C++之auto_ptr

 

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。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值