8

我对这个习语的感觉是它很有用,因为它确保在使用它们的对象超出范围后释放资源。

换句话说,它更多的是关于de-acquisitionde-initialisation,那么为什么这个成语会这样命名呢?

4

1 回答 1

11

首先,我应该指出,它被广泛认为是一个名称不佳的成语。许多人更喜欢 SBRM,它代表堆栈绑定资源管理。虽然我(不情愿地)同意使用“RAII”只是因为它广为人知和使用,但我确实认为 SBRM 可以更好地描述真实意图。

其次,当RAII 是新的时,它既适用于资源的获取,也适用于资源的释放。特别是,在当时很常见的是,初始化分两步进行。您首先定义一个对象,然后才动态分配与该对象关联的任何资源。许多风格指南都提倡这一点,主要是因为当时(在 C++ 有异常处理之前)没有很好的方法来处理构造函数中的失败。因此,风格指南经常说,构造函数应该只做最少的工作,特别是避免任何可能失败的事情——尤其是分配资源(还有一些人仍然这么说)。

不过,其中相当一部分已经处理了在析构函数中释放资源的问题,因此这与以前的做法并没有那么明显的区别。

于 2012-04-10T19:51:45.160 回答