【发布时间】:2019-06-19 12:54:54
【问题描述】:
我已将 FastMM4 添加到我的项目中以检测内存泄漏
program MyProg;
uses
{$IFDEF DEBUG}
FastMM4,
{$ENDIF}
...other uses
在表单关闭 FastMM4 时生成一个MemoryManager_EventLog.txt,带有所有泄漏块。
这是一个例子:
--------------------------------2019/6/19 9:49:25--------------------------------
A memory block has been leaked. The size is: 20
This block was allocated by thread 0x558, and the stack trace (return addresses) at the time was:
4075D2 [System.pas][System][@GetMem$qqri][4614]
40ABAF [System.pas][System][TObject.NewInstance$qqrv][16452]
40B3D6 [System.pas][System][@ClassCreate$qqrpvzc][17790]
40AD20 [System.pas][System][TObject.$bctr$qqrv][16516]
F3BEF6 [NdST.pas][NdST][TFinder.$bctr$qqrp14System.TObject][1011]
11157D1 [SuperNode.pas][SuperNode][TSuperNode.$bctr$qqrp14System.TObject][993]
D1D840 [Network.pas][Network][TNetwork.Create$qqrv][968]
F3A70D [NdST.pas][NdST][TNdST.$bctr$qqrp14System.TObject][177]
F3B658 [NdST.pas][NdST][TNdSTCAP.$bctr$qqrp14System.TObject][652]
10A4CCA [Print.pas][Print][TPrint.CreateCollection$qqrv][4274]
10A2773 [Print.pas][Print][TPrint.CreateItem$qqrv][3031]
The block is currently used for an object of class: TList
The allocation number is: 53883
Current memory dump of 256 bytes starting at pointer address 7EBA5360:
48 FA 49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7C C4 2D 79 00 00 00 00 E0 4B BA 7E
00 00 00 00 00 00 00 00 9C CD 41 00 00 00 00 00 7C D2 00 00 D2 75 40 00 AF AB 40 00 D6 B3 40 00
1A 72 11 01 29 AD 40 00 F8 57 11 01 40 D8 D1 00 0D A7 F3 00 58 B6 F3 00 CA 4C 0A 01 73 27 0A 01
58 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20 AD 40 00 B8 AB 40 00 D1 57 11 01 F4 1B 0B 01 22 4D 0A 01 87 27 0A 01 0A 48 11 01 52 6E 11 01
H ú I . . . . . . . . . . . . . . . . . | Ä - y . . . . à K º ~
. . . . . . . . œ Í A . . . . . | Ò . . Ò u @ . ¯ « @ . Ö ³ @ .
. r . . ) @ . ø W . . @ Ø Ñ . . § ó . X ¶ ó . Ê L . . s ' . .
X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . x ï ï †
< - . . À F ¼ ~ . . . . . . . . . . . . ‡ . . y . . . . . Q º ~
. . . . . . . . . . . . . . . . € Ò . . Ò u @ . ¯ « @ . Ö ³ @ .
@ . ¸ « @ . Ñ W . . ô . . . " M . . ‡ ' . . . H . . R n . .
泄漏似乎是由 TList 引起的,但我释放了每个 TList。 TList.Free不够吗?
【问题讨论】:
-
问题太多。这里一次一个问题。我们不做教程,它们显然是题外话。你最好在 Delphi Praxis 询问。
-
最重要的是分配时的堆栈跟踪。那是你没有破坏的东西。通常对象 A 拥有对象 B 并且它们都泄漏。因此,即使您在 A 的析构函数中销毁了 B,如果您不销毁 A,那么它们都会泄漏。
-
@DavidHeffernan 那么,我必须在销毁 TList 之前将每个对象销毁到 TList 中?
-
谁知道?我们没有。我们看不到任何代码。你读过我的 cmets 告诉你这不是主题吗?
-
@DavidHeffernan 我在这里没有看到太多问题。
标签: delphi memory-management memory-leaks fastmm