C++异常(exception)第三篇-------如何释放资源(没有finally语句)

问题:

C++中没有finally,那么应该在哪里关闭资源?

C++的try{}catch(){},为什么没有finally{}块来释放资源?
如类中的一个方法,局部变量
File * file=NULL;
Try{
file=fopen(“aaa.txt”,”r”);
然后执行一些操作。
}
最后fclose(file);
假如,file操作时发生异常,需要关闭。对于Java来说,是在finally{}块中关闭。不论是否发生异常,一定会关闭!
而C++中呢,怎样保证一定关闭这个文件呢?



分析:


1  使用一个类的对象而不是指针

在C++中通常使用RAII,即Resource Aquisition Is Initialization.
就是将资源封装成一个类,将资源的初始化封装在构造函数里,释放封装在析构函数里。要在局部使用资源的时候,就实例化一个local object。
在抛出异常的时候,由于local object脱离了作用域,自动调用析构函数,会保证资源被释放

//其实就是“栈展开”,就是在“弹栈”时候自动将栈中构造好的对象析构,这样就可以保证没有“资源泄漏”了。

简单的例子:
try {
   File f("xxx.ttt");
    //other file operation
}//File pointer is released here
catch {
    //exception process
}


2 封装在一个类中

楼主只要将这个对象指针“File * file”封装到另外一个对象中就可以了,如:
class foo{
public:
     File *file;
     foo() { //初始化file }
     ~foo() { //释放资源 }
};

这样不就可以了。


2 智能指针 把原来的对象指针包起来


try
{
    std::auto_ptr<file> pfile = new file();
    //....
}
catch(...)
{
    //....
}

都不用写delete了


总结自;http://bbs.csdn.net/topics/90070457


转载于:https://www.cnblogs.com/catkins/p/5270608.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值