关于delphi:为什么我的程序泄漏虚拟内存?

Why is my program leaking Virtual Memory?

为了寻找内存泄漏,我一直在使用MemProof,并且能够查看正在使用,创建和销毁的资源的实时计数。在我的程序运行了一天半之后,我注意到其他所有因素都保持不变或更少,虚拟内存(VM)的数量正在增加。它开始于109,现在经过24小时后达到113。

这是MemProof对每个VM泄漏所说的话:

VirtualAlloc(address_location,16384,4096,4);它被标识为虚拟内存,其大小始终为16384。API名称为VirtualAlloc。该模块是kernel32.dll。

此外,memproof说:" virtualalloc在调用进程的虚拟地址空间中保留或提交页面区域。必须在不再需要时使用virtualFree释放已分配的页面。"

VM泄漏与文件System.Pas中的功能相关联。

功能如下:

1
2
3
4
5
6
7
8
9
function GetCmdShow: Integer;
var
  SI: TStartupInfo;
begin
  Result := 10;                  { SW_SHOWDEFAULT }
  GetStartupInfo(SI);
  if SI.dwFlags and 1 <> 0 then  { STARTF_USESHOWWINDOW }
    Result := SI.wShowWindow;  
end;  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

当我单击虚拟内存泄漏时,Memproof带我去了关键词" end",这是我的不足之处。

那么这是什么意思?


Delphi的FastMM内存管理器在Windows内存系统上运行。 它使用VirtualAlloc从OS分配大块内存,然后将其分成较小的块供程序使用。 如果释放大量内存,它将把部分内存还给操作系统。 但是,如果释放少量内存,则可能会保留它,因为您可能很快会再次需要它。 这是使FastMM快速运行的一部分,而不是内存泄漏。

任何只监视VirtualAlloc而实际上不注意FastMM所做的事情的内存分析器都会给您带来没有意义的结果。 正如David在评论中提到的那样,如果要跟踪实际内存泄漏,则需要使用FastMM工具。 从SourceForge下载完整版的FastMM并阅读文档,以了解如何启用FullDebugMode以及泄漏报告和日志记录,您将可以轻松得多。