delphi - 为什么我的程序会泄漏虚拟内存?

标签 delphi memory virtual memory-leaks

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

这就是 MemProof 对每个虚拟机泄漏的说法:

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

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

VM 泄漏与文件 System.Pas 中的函数相关。

功能如下:

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;  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

我有小于号指向关键字“end”,当我点击虚拟内存泄漏时,Memproof 将我带到这里。

那么,这意味着什么?

最佳答案

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

任何只监视 VirtualAlloc 而实际上不关注 FastMM 正在做什么的内存分析器都会给您带来没有意义的结果。正如 David 在评论中提到的,如果你想追踪真正的内存泄漏,你需要使用 FastMM 工具。从 SourceForge 下载 FastMM 的完整版本并阅读文档以了解如何启用 FullDebugMode 以及泄漏报告和日志记录,您将更轻松地使用它。

关于delphi - 为什么我的程序会泄漏虚拟内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5340775/

相关文章:

delphi - 在Delphi 2005中出现错误“找不到属性”

delphi - 自定义样式 TEdit

java将zip文件打开到内存中

c++ - 如何存储大小位数组,例如大小 % 8 != 0?

c - Kylix 中的 TEvent.WaitFor

delphi - Delphi Seattle 中运行时 DPI 更改后如何处理菜单缩放

java - Web2py上传大文件ssl失败

c++ - C++中的虚函数必须实现吗?

c++ - 重写非常量虚方法是否隐藏了常量重载?

c++ - 虚拟基类上的虚拟方法