【发布时间】:2008-12-21 22:05:56
【问题描述】:
Bjarne Stroustrup 在他的C++ Style and Technique FAQ 中写道,强调我的:
因为 C++ 支持几乎总是更好的替代方法:“资源获取即初始化”技术(TC++PL3 第 14.4 节)。基本思想是用一个本地对象来表示一个资源,这样本地对象的析构函数就会释放资源。这样,程序员就不会忘记释放资源。例如:
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”构造更少。
请注意,Bjarne 写的是“几乎总是更好”而不是“总是更好”。现在我的问题是:在什么情况下finally 构造比在 C++ 中使用替代构造 (RAII) 更好?
【问题讨论】:
-
您在问两个不同的问题。标题问为什么没有 finally,而实际帖子要求提供 finally 比 RAII 更好的案例示例。我建议您编辑其中一个,以便它们实际上匹配。在搜索中偶然发现这篇文章的人会感到困惑。