2012-04-17 9 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

У меня часто есть пулы буферов, которые содержат тысячи объектов, которые я явно не освобождаю при выходе приложения. Мне не нравятся прохожие указатели на все эти буферные поля и т. Д. Внутри. Думаю, я оставлю сообщение об утечке :( –

+2

@MartinJames, тогда я надеюсь, что никто никогда не будет работать над вашим кодом. Это делает невозможным проверку подлинной утечки. –

+1

@martin Это не так, пишите тысячи вызовов в RegisterExpectedMemoryLeak –