调用CloseHandle(句柄)处理NULL是否安全

时间:2017-11-30 14:17:13

标签: c++ winapi mfc

删除NULL指针是安全的。

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

Handles是什么意思?

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;

1 个答案:

答案 0 :(得分:8)

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

  

hObject [in]打开对象的有效句柄。

NULL不是打开对象的句柄。

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

您必须将代码编写为:

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

(在此之后没有必要将m_hThread设置为NULL - 它将在很短的时间内停止存在。)