问题:

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


相关文章:

  • 2021-12-20
  • 2021-12-30
  • 2022-12-23
  • 2022-12-23
  • 2021-05-12
  • 2021-12-04
猜你喜欢
  • 2021-12-13
  • 2021-09-10
  • 2022-02-14
  • 2022-12-23
  • 2022-12-23
  • 2021-08-17
  • 2022-12-23
相关资源
相似解决方案