[转] 为何C 不提供“finally”结构? - C 风格与技术 FAQ - 蚂蚁...

来源:百度文库 编辑:神马文学网 时间:2024/04/29 11:23:26
Q:
A: 因为C++提供了另一种机制,完全可以取代finally,而且这种机制几乎总要比finally工作得更好:就是——“分配资源即初始化”。(见《The C++ Programming Language》14.4节)基本的想法是,用一个局部对象来封装一个资源,这样一来局部对象的析构函数就可以自动释放资源。这样,程序员就不会“忘记释放资源”了。 [译注:因为C++的对象“生命周期”机制替他记住了 :O) ] 下面是一个例子:
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"); // open fn for reading and writing// use file through f}
在一个系统中,每一样资源都需要一个“资源局柄”对象,但我们不必为每一个资源都写一个“finally”语句。在实作的系统中,资源的获取和释放的次数远远多于资源的种类,所以“资源分配即初始化”机制产生的代码要比“finally”机制少。
[译注:Object Pascal,Java,C#等语言都有finally语句块,常用于发生异常时对被分配资源的资源的处理——这意味着有多少次分配资源就有多少finally语句块(少了一个finally就意味着有一些资源分配不是“exception safe”的);而“资源分配即初始化”机制将原本放在finally块中的代码移到了类的析构函数中。我们只需为每一类资源提供一个封装类即可。需代码量孰多孰少?除非你的系统中每一类资源都只被使用一次——这种情况下代码量是相等的;否则永远是前者多于后者 :O) ]
另外,请看看《The C++ Programming Language》附录E中的资源管理例子。