2012-04-17 5 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がそれをリークとして報告しているのであれば、本当はリークです。

オブジェクトが作成され、プログラムが終了する前にオブジェクトを破棄できませんでした。通常、これはコードの単純なエラーによるものです。おそらくあなたはオブジェクトの人生を守るためにtry/finallyを省略したでしょう。

破壊されていないグローバルスコープオブジェクトの場合、プログラム終了時に破壊することができます。または、RegisterExpectedMemoryLeakに電話して、そのオブジェクトを破棄しないことを示すことができます。しかし、あなたが意図的にオブジェクトを漏らすときにのみそれをします。意図的ではない漏れに対して紙に使用しないでください。

しかし結論として、FastMMは存在しません。あなたが漏れていると言えば、それを信頼してください。

+1

私はしばしば、アプリケーション終了時に明示的に解放しない何千ものオブジェクトを含むバッファプールを持っています。私はその中のすべてのそれらのバッファフィールドなどへのポインタを渡すことを気にしません。私はリークレポートをオフにしておきたいと思います:( –

+2

@MartinJames、誰もあなたのコードで作業する必要がないことを願っています。これで実際のリークをチェックすることは不可能になります。 –

+1

@martin RegisterExpectedMemoryLeakに何千もの呼び出しを書きます。 –