因为 C++提供了另外一种方法,它几乎总是更好的:“资源获得即初始化”(resource
acquisiton is initialization)技术。基本的思路是,通过一个局部对象来表现资
源,于是局部对象的析构函数将会释放资源。这样,程序员就不会忘记释放资源了。举例来
说:
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”构造相比,“资源获得即初始化”技术会产生少得多的代码。