2012-04-17 51 views
3

我调试我与FastMM程序,它似乎很多内存泄漏是报告似乎合法的内存分配不实际内存泄漏。FastMM是否仅报告内存泄漏和内存分配?

例如,

A memory block has been leaked. The size is: 20 

This block was allocated by thread 0xD44, and the stack trace (return addresses) at the time was: 
404902 [System.pas][System][@GetMem][3693] 
406597 [System.pas][System][TObject.NewInstance][11044] 
406B2A [System.pas][System][@ClassCreate][12121] 
60A1D2 [CtrlObjs.pas][Ctrlobjs][TConnObj.Create][430] 
61703B [Control.pas][Control][TControlMgr.FindLinks][854] 
60ACB2 [CtrlObjs.pas][Ctrlobjs][TControlObject.FindLink][746] 
60E2A3 [CtrlObjs.pas][Ctrlobjs][TDelayControl.EvalPulse][2105] 
60E4C0 [CtrlObjs.pas][Ctrlobjs][TDelayControl.Evaluate][2193] 
6102D4 [CtrlObjs.pas][Ctrlobjs][TLineControl.Evaluate][3155] 
60ABF1 [CtrlObjs.pas][Ctrlobjs][TControlObject.ActiveCount][711] 
6105D8 [CtrlObjs.pas][Ctrlobjs][TLineControl.ActiveCount][3261] 

The block is currently used for an object of class: TConnObj 

TConnObj是经常被用来创建一个对象,当程序不再需要它被销毁类。然而,FastMM报告它是实际的内存泄漏。那么,您如何判断在查看FastMM内存泄漏日志文件时是哪个?

回答

8

如果FastMM报告它是一个泄漏,那么它确实是一个泄漏。

您已经创建了一个对象,并且在程序终止之前无法销毁它。通常这是由于代码中的一个直接的错误。也许你为了保护物体的生命而省略了一些尝试/最后。

如果这是一个全局范围的对象没有被销毁,那么你可以简单地在程序终止时销毁它。或者你可以拨打RegisterExpectedMemoryLeak以表明您不打算销毁对象。但只有在你故意泄漏物体时才这样做。不要使用它来清理非故意的泄漏。

但是底线是FastMM不说谎。如果它说你在泄漏,请相信它。

+1

我经常包含数千个我没有明确的分类,在应用程序退出对象的缓冲池。我不喜欢在内部传递指向所有这些缓冲区等的指针。我猜我会离开泄漏报告:( – 2012-04-17 23:12:00

+2

@MartinJames,那么我希望没有人会永远不必为你的代码工作,这使得不可能检查真正的泄漏 – 2012-04-18 02:25:27

+1

@马丁这不像你必须写数以千计的电话到RegisterExpectedMemoryLeak – 2012-04-18 05:43:43