RAII技术

RAII(Resource acquisition is initialization)资源获取即初始化,它是一项很简单的技术,利用C++对象生命周期的概念来控制程序的资源,例如内存,文件句柄,网络连接以及审计追踪(audit trail)等. 若希望保持对某个重要资源的跟踪,那么创建一个对象,并将资源的生命周期和对象的生命周期相关联。即:调用类构造函数中初始化资源类对象,在调用类析构函数中释放资源类对象。

简单点就是:将堆对象交由栈来管理,栈是有生命周期的,不需要手动释放内存。

应用场景:观察下面这个例子

demo1:
class ResourceControl
{
    public:
    ResourceControl();
    ResourceControl(const ResourceControl&);
    ResourceControl& operator = (const ResourceControl&);
    ~ResourceControl();
    Resource* GetResource();
    void Work();
    private:
    Resource *rh_;
};
void ResourceControl::Work()
{
 rh_ = new Resource;
     //…
   if( //异常出现时,提前结束 ) //糟糕的维护
   {
        return;
   }

   //…

   delete rh_; //一定能执行到这里吗?
}
Resource * ResourceControl::GetResource( ) 
{
       return this->rh_;
}

由于程序可能提前return,delete rh_;语句执行不到,导致资源没有释放。
解决方案:使用RAII技术,修改如下,将Resource 类对象放在构造函数中初始化,在析构函数中释放。

class ResourceControl
{
    public:
    ResourceControl(Resource *rh);
    ResourceControl(const ResourceControl&);
    ResourceControl& operator = (const ResourceControl&);
    ~ResourceControl();
    Resource* GetResource();
    void Work();
    private:
    Resource *rh_;
};
ResourceControl::ResourceControl(Resource *rh):rh_(rh)
{
    //其他初始化工作
}
ResourceControl::~ResourceControl()
{
    delete   this->rh_;
    //其他初始化工作
}
Resource* GetResource()
{
  return this->rh_;
}

接下来还有一个重要的问题,如何保证析构函数肯定被调用到?

ResourceControl对象的最美妙之处在于,若它被声明为一个函数的局部变量,或作为函数的参数,或是一个静态对象,即栈对象,那么就可以保证析构函数会得到调用。堆对象则必须要显示调用delete。
ResourceControl* rc = new ResourceControl( new Resource ); //糟糕的思路

以下是参考的博文地址:
http://blog.csdn.net/armman/article/details/1547651#comments

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值