问题:
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