c++ - 调用 handle 为 NULL 的 CloseHandle(handle) 是否安全

标签 c++ winapi mfc

删除 NULL 指针是安全的。

int* p = NULL;
delete p;         // ok, secure

句柄是什么?

HANDLE h = NULL;
CloseHandle(h);   // allowed?

我正在阅读 MSDN但仍然不确定。它说了一些关于 ERROR_INVALID_HANDLE 的内容,但它是 6L,而不是 NULL。

我来自一个类的析构函数,它给我一个 C6387 警告 Error

if (m_hThread)
    WaitForSingleObject(m_hThread, INFINITE);
CloseHandle(m_hThread);    // warninig C6387
m_hThread = NULL;

最佳答案

没有。您不能在 NULL 句柄上调用 CloseHandle。查看参数的文档。它说:

hObject [in] A valid handle to an open object.

NULL 不是打开对象的句柄。

您获得 C6387 的事实正是因为您将“可能为空”的句柄传递给 CloseHandle

您必须将代码编写为:

if (m_hThread) {
    WaitForSingleObject(m_hThread, INFINITE);
    CloseHandle(m_hThread);
}

(在此之后将 m_hThread 设置为 NULL 没有意义 - 它会在很短的时间内不复存在)。

关于c++ - 调用 handle 为 NULL 的 CloseHandle(handle) 是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47575594/

相关文章:

c++ - QImage RGB32 到 QImage RGB24,某种图像的结果不好

c# - 在 C# 中禁用屏幕保护程序和电源选项

windows - 在C :\Program Files (x86)\MyApp\myapp. cfg中写入配置文件,与管理员权限

c++ - 按钮控件需要一些时间才能在对话框中禁用

c++ - VS2012中MFC中的调试断言

c++ - 如何使用 CSingleLock 提供对此缓冲区的访问权限?

链表最后一个元素的 C++ 迭代器?

c++ - 重复使用 prefix++ 运算符时的未定义行为

c++ - 如何在从抽象基派生的类中实现相同的方法?

c - Windows 事件 API 对驱动器安装使用react?