8

这是我上一个问题的后续问题。

正如我上一个问题的答案中所建议的,我使用ProcessExplorer分析了我的应用程序用来查找句柄泄漏的句柄列表。

泄漏的句柄属于Section类型。

究竟什么是节句柄,它在哪里使用以及什么会导致节句柄泄漏?

我没有在我的代码中使用内存映射文件。

4

4 回答 4

4

引用 Mark Russinovich 的 Inside Windows 2000(现在称为 Windows Internals),

节对象,Win32 子系统称为文件映射对象,表示两个或多个进程可以共享的内存块。

所以,它是一个内存映射文件。如果您创建了一个内存映射文件并且未能关闭它,它们就会泄漏。很难说得更具体。

于 2011-10-21T08:28:34.430 回答
3

事实证明,问题出在一个计算当前进程线程数的低级函数中。这个函数使用了

CreateToolhelp32Snapshot

返回未正确关闭的句柄的 API 函数。我不确定为什么这会产生部分句柄泄漏。

于 2011-11-28T11:55:35.757 回答
2

与文件句柄无关的内存映射文件可用于 IPC(进程间通信)。如果您不直接使用它们,可能您的单元或组件之一正在执行一些 IPC 通信。很可能你使用一个组件连接到另一个进程,并没有按要求释放它。

首先要采取的措施是跟踪任何内存泄漏(使用 FastMM4 调试模式),您肯定会在代码中找到一些未释放的对象。

由于句柄通常由对象分配,因此根据我的实验,解决所有内存泄漏将解决句柄泄漏。

如果您没有任何内存泄漏,则会有一些CreateFileMapping()调用来检查CloseHandle()所有源代码(包括第三方源代码)中的对应项。

于 2011-10-21T14:53:59.753 回答
1

.net 中的部分句柄泄漏是由于 Microsoft 修补程序 KB2670838。卸载此更新,将修复部分句柄泄漏问题(内存不足)。

Parameter is not valid. at System.Drawing.Image.get_Width()
at System.Drawing.Image.get_Size()
于 2014-02-26T13:51:43.887 回答