什么会导致段处理泄漏



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

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

泄漏的句柄类型为Section

section句柄到底是什么,在哪里使用它,什么会导致section句柄泄漏?

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

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

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

这是一个内存映射文件。如果你创建了一个内存映射文件并且没有关闭它,它们就会泄漏。很难更具体了

原来问题出在一个低级函数中,该函数计算当前进程的线程数。这个函数使用了

CreateToolhelp32Snapshot

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

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

要采取的第一个操作是跟踪任何内存泄漏(使用FastMM4调试模式),您肯定会在代码中发现一些未释放的对象。

由于句柄通常由对象分配,从我的实验来看,解决所有内存泄漏将解决句柄泄漏。

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

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

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

相关内容

  • 没有找到相关文章

最新更新