【发布时间】:2011-07-17 11:32:40
【问题描述】:
为了寻找内存泄漏,我一直在使用 MemProof,并且能够查看正在使用、创建和销毁的资源的实时计数。在运行我的程序超过一天半之后,我注意到其他一切都保持不变或更少,虚拟内存(VM)的数量正在增加。开始是 109,现在 24 小时后是 113。
这是 MemProof 对每个 VM 泄漏的说法:
VirtualAlloc(address_location, 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; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
当我点击虚拟内存泄漏时,Memproof 会将我带到关键字“end”处。
那么,这是什么意思?
【问题讨论】:
-
VirtualAlloc 是调用系统分配内存的函数。如果您停止调用 VirtualAlloc,您将不会泄漏内存。您也无法进行动态分配。不是很有用。我简直无法理解您为什么不使用告诉您泄漏位置的工具。
-
David 没有在我的源文件中调用 VirtualAlloc。该程序没有直接调用 VirtualAlloc。它被隐式调用。顺便说一句,我会在上一个问题中提出这个问题,尽管它与这个问题有关,但它并不相同。我特意询问 VirtualAlloc。
-
@user FastMM 在您向 FastMM 请求内存并且它需要系统提供更多内存时代表您调用 VirtualAlloc。我认为你应该听从 Mason 的建议。
标签: delphi memory virtual memory-leaks