使用HeapDestroy时需要CloseHandle吗?

时间:2018-06-21 15:27:23

标签: c windows winapi

我在堆上分配了一个HANDLE数组,然后每个句柄都与一个线程相关联。 完成工作后,在调用HeapDestroy()之前是否必须在每个函数上都调用CloseHandle()?还是后一个调用使第一个没有用?

2 个答案:

答案 0 :(得分:1)

操作完成后,请始终关闭手柄-这是一个好习惯。 Windows内核具有用于跟踪分配的句柄和它们分配给谁的表,因此记住关闭它们将是您的最大利益。

句柄泄漏也是一个存在的问题,它是在调用方请求句柄但没有将其关闭并且在一段时间内堆积起来的时候。

您有时还会通过不关闭句柄而引起其他问题(例如,如果您打开了文件的句柄并拒绝了共享,但在不再需要打开的句柄时保持了打开的句柄,则存在共享冲突)。

但是,确切地说,句柄是伪造的-Windows内核会翻译它们,因为它依赖于内部的,未记录的且未导出的表,该表将实际指针地址存储到链接到该伪造句柄的内核对象。

答案 1 :(得分:0)

是的,当然您必须先关闭手柄! Windows不知道(或关心)您在堆中存储了哪些数据,因此它无法自动关闭句柄。

相关问题