【发布时间】:2014-04-19 19:14:12
【问题描述】:
我非常了解 RAII 模式和 std::unique_ptr 以及 C++11 中的其他“智能指针”,但仍有一些情况我无法弄清楚如何在没有 goto Cleanup 的情况下很好地处理最后进行清理的部分。
具体来说,我正在考虑 Windows 编程,有时我会想要泄漏句柄,而其他时候我不会。
如果我有一个类似于他的函数:
PROCESS_INFORMATION p;
if (!CreateProcess(... &p))
{
throw windows_error(GetLastError());
}
DWORD r = WaitForSingleObject(h, 5000);
if (r == WAIT_TIMEOUT || r == WAIT_FAILED)
{
// terminate process, close handles
throw ...;
}
if (!SetEnvironmentVariable(...))
{
// terminate process, close handles
throw windows_error;
}
(a few other operations that if they fail i have cleanup to do).
return process handle;
我真的不明白unique_ptr 在这里如何帮助我,除非我在unique_ptr 上使用release(),毕竟if 表示成功/告诉@987654329 @不清理它。 (我可以为unique_ptr 创建一个特殊的删除器,这样它就可以正确清理窗口句柄)。但是,我的问题是,在我想将分配的内存/句柄泄漏回调用者的情况下,在智能指针上使用release() 是“正确的”吗?有更好的方法吗?返回shared_ptr 也可以,我想...
【问题讨论】:
-
当你说“泄漏给调用者”时,你是在说函数的返回值吗?
-
在我现在的特殊情况下,我将它保存到我班级的私有 HANDLE 字段中。但是,是的,一般来说,我只是指调用者,或者“超出函数范围的生命周期”。
-
代码下的描述听起来很像著名的Scope Guard (Alexandrescu/Marginean)。 Here's the original article 但有更好的 C++11 实现。但是,构建/使用一个单独负责管理该 Process 资源的类可能更合适。
标签: c++11 raii resource-cleanup