什么会导致部分处理泄漏?

这是对我以前的问题的后续问题。

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

泄漏的句柄是Sectiontypes的。

什么是一个部分句柄,它在哪里使用,并可能导致部分句柄泄漏?

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

引用Mark Russinovich的Inside Windows 2000(现在叫做Windows Internals),

Win32子系统调用文件映射对象section对象代表两个或多个进程可以共享的内存块。

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

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

CreateToolhelp32Snapshot 

返回句柄的API函数,该句柄没有正确关闭。 我不知道为什么这会产生一个节处理泄漏。

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

首先要采取的行动是跟踪任何内存泄漏 (使用FastMM4调试模式),你一定会发现你的代码中有一些未发布的对象。

由于句柄通常由对象分配,所以在我的实验中,解决所有的内存泄漏将解决句柄泄漏问题。

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

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

 Parameter is not valid. at System.Drawing.Image.get_Width() at System.Drawing.Image.get_Size()