C++-为什么在C++语言中没有finally?

C++-为什么在C++语言中没有finally?

偏爱自由 发布于 2017-09-21 字数 228 浏览 1030 回复 3

C++中有try和catch,为什么没有像JAVA中的finally呢?举一个例子:

File * file = NULL;
try{
file=fopen("data.txt",”r”);
//其它操作;
}catch(...){
fclose(file);
}
fclose(file);

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

甜柠檬 2017-10-23 3 楼

参考一下这个:Why doesn't C++ provide a "finally" construct?,大意是:
因为C++提供了另一种 机制,完全可以取代finally,而且这种机制几乎总要比finally工作得更好:就是——“分配资源即初始化”。(见《The C++ Programming Language》14.4节)基本的想法是,用一个局部对象来封装一个资源,这样一来局部对象的析构函数就可以自动释放资源。这样,程序员就不会“忘记 释放资源”了

归属感 2017-10-12 2 楼

因为 C++提供了另外一种方法,资源获得即初始化。它的基本的思路是,通过一个局部对象来表现资源,于是局部对象的析构函数将会释放资源。这样,程序员就不会忘记释放资源了。例个例子:

class File_handle {
FILE* p;
public:
File_handle(const char* n, const char* a)
{ p = fopen(n,a); if (p==0) throw Open_error(errno); }
File_handle(FILE* pp)
{ p = pp; if (p==0) throw Open_error(errno); }

~File_handle() { fclose(p); }

operator FILE*() { return p; }

// ...
};

void f(const char* fn)
{
File_handle f(fn,"rw"); //打开fn进行读写
// 通过f 使用文件
}

在一个系统中,需要为每一个资源都使用一个“资源句柄”类。无论如何,我们不需要为每
一个资源获得都写出“finally”语句。在实时系统中,资源获得要远远多于资源的种类,
因此和使用“finally”构造相比,“资源获得即初始化”技术会产生少得多的代码!这大概是C++设计者的初衷吧!

虐人心 2017-09-24 1 楼

以上二位的讲解介绍了为什么C++没有finally,对于显式释放的资源(比如文件,数据库连接)都自己做封装。但是对于很多简单的资源操作我们并不都必须将其封装成类。我介绍一种不使用RAII机制的思路,可以使用goto来实现自己的finally(goto语句不可滥用,但是使用好了确实可以简化程序逻辑)