1

我有一个std::map<std::string, HANDLE> SampleMapHANDLE对象存储为值。使用地图后,我正在清除所有地图条目。

SampleMap.clear();

通过这样做,句柄对象会发生什么。他们会被删除吗?

4

5 回答 5

3

HANDLE 只是 typedef 或指针的定义(AFAIK void*)。

清除地图时,它们不会被删除,您必须自己关闭/释放它们。

或者编写一个包装类来为你做这件事。请参阅此线程如何将 C++ 标准智能指针与 Windows HANDLE 一起使用?一些初步的想法。

于 2012-06-26T08:44:33.707 回答
1

s 是一种指针,因此HANDLE删除它们并没有多大作用,要正确释放这些HANDLEs 指向的资源,您必须显式调用相应的函数(如CloseHandle)。

于 2012-06-26T08:44:16.747 回答
1

它们不会被删除,它们会变成悬空指针/句柄。

如果要自动删除,请使用 std::unique_ptr 并覆盖删除器对象以删除包含的任何类型的句柄。

于 2012-06-26T08:45:37.980 回答
0

我很确定这与不关闭句柄并仅删除本地对象引用的情况相同。恐怕您CloseHandle每次都必须使用功能。正如您可能知道的那样,操作系统会跟踪对对象的引用次数,并仅在它等于零时将其删除。通知操作系统您不再需要该对象的唯一方法是使用CloseHandle函数。否则句柄会留在某个句柄表中,不会被删除。

于 2012-06-26T08:44:07.990 回答
0

通过这样做,句柄对象会发生什么

没有什么。

他们会被删除吗?

不。

于 2012-06-26T08:44:28.763 回答