在我的代码中,我使用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_ptr与custom deleter一起使用。
关于c++ - 使非对象资源符合RAII,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1556168/