2011-03-17 46 views
2

为了寻找内存泄漏,我一直在使用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)。

那么,这是什么意思?

+0

[为什么在应用程序的第一行代码执行之前调用TObject.Free?](http://stackoverflow.com/questions/5331783/why-tobject-free-is-called-before我的应用程序的第一行代码是exe) – 2011-03-17 15:34:13

+1

VirtualAlloc是一个调用来从系统分配内存的函数。如果您停止调用VirtualAlloc,则不会泄漏内存。你也无法做动态分配。不是很有用。我简直不明白为什么你不会使用这个工具来告诉你你的漏洞在哪里。 – 2011-03-17 15:45:45

+0

David在我的源文件VirtualAlloc被调用的地方没有。该程序不直接调用VirtualAlloc。它被隐含地称为。顺便说一句,我会在我以前的问题中提出这个问题,虽然它与这个问题有关,但它是不一样的。我具体询问VirtualAlloc。 – ThN 2011-03-17 16:35:48

回答

5

德尔福的FastMM内存管理器工作在Windows内存系统之上。它使用VirtualAlloc从操作系统分配大块内存,然后将其分成更小的块,供程序使用。如果你释放了大量的内存,它会将一些内存回给操作系统。但是,如果你释放少量的内存,它很可能会持续下去,因为你可能很快就会需要它。这是FastMM速度的一部分,它不是内存泄漏。

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

+0

好的。我去做。我乐于接受建议。谢谢。 – ThN 2011-03-17 16:38:47

+0

+1感谢您的支持! – 2011-03-17 16:59:56

+0

@David和@Mason FastMM4绝对需要一些习惯,因为它的用户界面(日志文件)非常神秘而且有点吓人(如果我可以这么说)。但是,在运行我的软件后,我花了一些时间浏览日志文件,并在源文件中发现各种泄漏。其中一些显而易见但被忽视。谢谢你的帮助。 – ThN 2011-03-17 20:36:57