在我的代码中我使用了HANDLEs 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");
}
Run Code Online (Sandbox Code Playgroud)
如您所见,您必须将此插入CloseHandle到可能在获取和释放过程中发生的每个异常中.因此,你可能会忘记一个(或者有一个你不知道的奇特的SEH异常)并且瞧,你的内存泄漏了.
最近,我已经阅读了RAII,它应该消除这种情况的麻烦,并应CloseHandle自动调用.我也看到std::auto_ptr<someType>C++ 中有类似的东西可以解决分配的资源问题new.
但是,因为我不使用new,因为HANDLE只是typedef编辑void *,我想知道我应该如何使用std::auto_ptr<someType>.不知何故,它应该可以给它一个自定义删除函数(if (!CloseHandle(h)) { throw std::exception("closeHandle error"); }).创建一个类将是另一种方法,因为析构函数在其实例超出范围时被调用.然而,为每一件简单的事情设一个课程实在是太过分了.
我该如何解决这些意外的内存泄漏?
请注意,我更喜欢纯C++中没有库和大依赖关系的解决方案,除非它们非常小并且无论如何都要在大多数环境中使用.
想到的一个想法是将boost :: shared_ptr与自定义删除器一起使用.