使非对象资源符合RAII标准

Eta*_*tan 1 c++ raii auto-ptr

在我的代码中我使用了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++中没有库和大依赖关系的解决方案,除非它们非常小并且无论如何都要在大多数环境中使用.

Fre*_*son 6

想到的一个想法是将boost :: shared_ptr自定义删除器一起使用.

  • 智能指针是解决此问题的错误方法.你需要的是一个简单的包装. (3认同)
  • 是的,这是`shared_ptr`已被设计为*,并且表现良好的事情之一.这绝对是最好的解决方案(虽然我通常避免这种绝对). (2认同)
  • @Fred:我们显然不同意什么是复杂性.但是共享指针显然是错误的智能指针.充其量这应该是一个scopped指针.没有要求通过代码的任何其他部分传递或共享所有权.它在一个只需要例外安全的地方创建和销毁. (2认同)