对于一个极其强大的概念来说,这是一个非常糟糕的名字,而且也许是 C++ 开发人员在转向其他语言时最容易错过的事情之一。有一些运动试图将这个概念重新命名为范围限制的资源管理,尽管它似乎还没有流行起来。
当我们说“资源”时,我们不仅仅指内存 - 它可以是文件句柄、网络套接字、数据库句柄、GDI 对象……简而言之,我们的供应有限,因此我们需要能够控制它们的使用。 “范围绑定”方面意味着对象的生命周期绑定到变量的范围,因此当变量超出范围时,析构函数将释放资源。它的一个非常有用的特性是它可以提高异常安全性。例如,比较一下:
RawResourceHandle* handle=createNewResource();
handle->performInvalidOperation(); // Oops, throws exception
...
deleteResource(handle); // oh dear, never gets called so the resource leaks
与 RAII 一起
class ManagedResourceHandle {
public:
ManagedResourceHandle(RawResourceHandle* rawHandle_) : rawHandle(rawHandle_) {};
~ManagedResourceHandle() {delete rawHandle; }
... // omitted operator*, etc
private:
RawResourceHandle* rawHandle;
};
ManagedResourceHandle handle(createNewResource());
handle->performInvalidOperation();
在后一种情况下,当抛出异常并且展开堆栈时,局部变量将被销毁,这确保了我们的资源被清理并且不会泄漏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)