RAII 资源获取是初始化

RAII 代表 - [R esource 一个 cquisition S nitialization。有时也称为 SBRM(基于范围的资源管理)或 RRID(资源释放是销毁),RAII 是用于将资源与对象生存期联系起来的习惯用法。在 C++中,对象的析构函数总是在对象超出范围时运行 - 我们可以利用它来将资源清理与对象销毁联系起来。

每当你需要获取最终需要释放的某些资源(例如锁,文件句柄,分配的缓冲区)时,你应该考虑使用对象来为你处理该资源管理。无论异常或早期作用域退出,都会发生堆栈展开,因此资源处理程序对象将为你清理资源,而无需仔细考虑所有可能的当前和未来代码路径。

值得注意的是,RAII 并没有完全释放开发人员思考资源的生命周期。显然,一种情况是崩溃或 exit() 调用,这将阻止析构函数被调用。由于操作系统将在进程结束后清理进程本地资源(如内存),因此在大多数情况下这不是问题。但是,对于系统资源(即命名管道,锁定文件,共享内存),你仍然需要设施来处理进程在自身之后没有清理的情况,即在启动测试时是否存在锁定文件,如果是,验证具有 pid 的进程实际存在,然后相应地采取行动。

另一种情况是当 unix 进程从 exec-family 调用一个函数时,即在 fork-exec 之后创建一个新进程。这里,子进程将拥有父对象内存的完整副本(包括 RAII 对象),但是一旦调用了 exec,就不会在该进程中调用任何析构函数。另一方面,如果进程是分叉的,并且两个进程都没有调用 exec,则在两个进程中都会清除所有资源。这对于在 fork 中实际复制的所有资源都是正确的,但是对于系统资源,两个进程都只有对资源的引用(即锁文件的路径),并且都会尝试单独释放它,可能导致另一个失败的过程。