相关疑难解决方法(0)

CreateFile可以返回NULL吗?

我知道CreateFile返回的无效值是INVALID_HANDLE_VALUE.但是因为我也喜欢使用RAII,所以很容易将HANDLE放在shared_ptr(如下:)中 shared_ptr<void> handle (CreateFile(args),&CloseHandle)以确保句柄关闭.我唯一担心这种快速简便的RAII方法是CreateFile可以返回NULL作为HANDLE值.

c++ windows winapi

6
推荐指数
1
解决办法
1920
查看次数

使非对象资源符合RAII标准

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

c++ raii auto-ptr

1
推荐指数
1
解决办法
713
查看次数

标签 统计

c++ ×2

auto-ptr ×1

raii ×1

winapi ×1

windows ×1