在我的代码中,我使用HANDLE
s from windows.h
。它们被用作
HANDLE h;
if (!openHandleToSomething(arg1, arg2, &h)) {
throw std::exception("openHandleToSomething error");
}
/* Use the handle in other functions which can throw as well */
if (!CloseHandle(h)) {
throw std::exception("closeHandle error");
}
如您所见,您必须将其插入CloseHandle
到可能在获取和释放过程中发生的每个异常中。因此,您很可能忘记了一个(或者有一个您不知道的花哨的 SEH 异常)并且瞧,您有内存泄漏。
最近,我读到了关于 RAII 的文章,它应该可以消除这种情况下的麻烦,并且应该CloseHandle
自动调用它。我还看到std::auto_ptr<someType>
在 C++ 中有类似的东西可以解决分配给new
.
但是,由于我不使用new
and 因为HANDLE
is just typedef
ed to be a void *
,所以我想知道我应该如何使用std::auto_ptr<someType>
. 不知何故,应该可以给它一个自定义删除函数(if (!CloseHandle(h)) { throw std::exception("closeHandle error"); }
)。创建一个类将是另一种方法,因为每当它的实例超出范围时都会调用析构函数。但是,为每件简单的事情开设一个班级只是过分了。
如何修复这些意外的内存泄漏?
请注意,我更喜欢纯 C++ 中没有库和大依赖项的解决方案,除非它们真的很小并且无论如何都在大多数环境中使用。