在我的代码中,我使用HANDLE中的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。我还看到C++中有类似std::auto_ptr<someType>的东西,它解决了用new分配的资源的问题。

但是,由于我不使用new,并且因为HANDLE仅是typedef,所以它是void *,所以我想知道如何使用std::auto_ptr<someType>。以某种方式,应该有可能为其提供一个自定义删除函数(if (!CloseHandle(h)) { throw std::exception("closeHandle error"); })。创建类将是另一种方法,因为析构函数的实例一旦超出范围就会被调用。但是,为每件简单的事情开设一门课实在是太过分了。

如何解决这些意外的内存泄漏?

请注意,我更喜欢纯C++中没有库和较大依赖项的解决方案,除非它们确实很小并且无论如何都在大多数环境中使用。

最佳答案

我想到的一个想法是将boost::shared_ptrcustom deleter一起使用。

关于c++ - 使非对象资源符合RAII,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1556168/

10-10 09:01