为了寻找内存泄漏,我一直在使用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需要我时,我点击虚拟内存泄漏(S)。
那么,这是什么意思?
[为什么在应用程序的第一行代码执行之前调用TObject.Free?](http://stackoverflow.com/questions/5331783/why-tobject-free-is-called-before我的应用程序的第一行代码是exe) – 2011-03-17 15:34:13
VirtualAlloc是一个调用来从系统分配内存的函数。如果您停止调用VirtualAlloc,则不会泄漏内存。你也无法做动态分配。不是很有用。我简直不明白为什么你不会使用这个工具来告诉你你的漏洞在哪里。 – 2011-03-17 15:45:45
David在我的源文件VirtualAlloc被调用的地方没有。该程序不直接调用VirtualAlloc。它被隐含地称为。顺便说一句,我会在我以前的问题中提出这个问题,虽然它与这个问题有关,但它是不一样的。我具体询问VirtualAlloc。 – ThN 2011-03-17 16:35:48