荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Dreamer (我与萤火虫), 信区: SoftDev
标  题: 【C++】[FAQ]为何C++不提供“finally”结构?
发信站: 荔园晨风BBS站 (Sat Jun 12 13:53:42 2004), 站内信件


Q: 为何C++不提供“finally”结构?
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中的资源管理例子。




--
如果你真的爱萤火虫,你就不应该将她困在瓶子里;
如果你真的爱萤火虫,你应该放开她,让她在天空中自由自在地飞!
虽然你会不舍得她,但是最终你就会明白这样你才真正拥有了她!

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.223]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店