4

我正在开发一个软件,所以我刚刚开始在我的项目中使用 FastMM4(真正的)。

我在网上找到了有关如何获取line numberFastMM4 的信息,我得到了行号,但我可以弄清楚日志中的其他信息是什么意思?

我在日志文件中有这个

This block was allocated by thread 0x15F8, and the stack trace (return addresses) at     the time was:
402E86 [system.pas][System][System.@GetMem][2648]
403A3B [system.pas][System][System.TObject.NewInstance][8824]
403DAA [system.pas][System][System.@ClassCreate][9489]
403A70 [system.pas][System][System.TObject.Create][8839]
46A257 [u_home.pas][u_home][u_home.TForm1.SpeedButton1Click][80] {<-memory leak is here, but what are the Other detections?}
443AAC [Controls.pas][Controls][Controls.TControl.Click][5226]
46958B [Buttons.pas][Buttons][Buttons.TSpeedButton.Click][1211]
46956B [Buttons.pas][Buttons][Buttons.TSpeedButton.MouseUp][1204]
443FB2 [Controls.pas][Controls][Controls.TControl.DoMouseUp][5352]
441BA0 [Controls.pas][Controls][Controls.TControl.SetMouseCapture][4379]
444042 [Controls.pas][Controls][Controls.TControl.WMLButtonUp][5364]

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

The allocation number is: 440

在这leak就是

   46A257 [u_home.pas][u_home][u_home.TForm1.SpeedButton1Click][80] {<-memory leak is here, but what are the Other detections?}

我的代码

 procedure TForm1.SpeedButton1Click(Sender: TObject);
  var
  str : TStringList;
  begin
  str := TStringList.Create;  {<--im not freeing the, so leak}

  end;

在此处输入图像描述

这是call stack 在此处输入图像描述

我在网上搜索,但我不知道其他检测是什么......

402E86 [system.pas][System][System.@GetMem][2648]
403A3B [system.pas][System][System.TObject.NewInstance][8824]
403DAA [system.pas][System][System.@ClassCreate][9489]
403A70 [system.pas][System][System.TObject.Create][8839]

{Other then this}
46A257 [u_home.pas][u_home][u_home.TForm1.SpeedButton1Click][80] {<-memory leak is here, but what are the Other detections?}
{Other then this}

443AAC [Controls.pas][Controls][Controls.TControl.Click][5226]
46958B [Buttons.pas][Buttons][Buttons.TSpeedButton.Click][1211]
46956B [Buttons.pas][Buttons][Buttons.TSpeedButton.MouseUp][1204]
443FB2 [Controls.pas][Controls][Controls.TControl.DoMouseUp][5352]
441BA0 [Controls.pas][Controls][Controls.TControl.SetMouseCapture][4379]
444042 [Controls.pas][Controls][Controls.TControl.WMLButtonUp][5364]

我正在使用delphi 2006

我也打开并尝试delphi 6, delph 7

检查 我发现这与 fastMM$ 检测和一些已经在 delphi 中的泄漏的注册有关。 如何使用 fastMM 追踪棘手的内存泄漏? 这用于注册泄漏,但它们是错误吗? 使用 FastMM4,如何注册泄露的字符串?

还有FastMM4、Delphi6、TApplication 的泄漏?

或者are they just the steps leading to the memory leak?

4

2 回答 2

6

您在日志中拥有的是导致内存分配泄漏的调用堆栈。

您可以在问题的调用堆栈中看到它有多么有用。想象一下,您只有顶行,即导致泄漏的调用

402E86 [system.pas][System][System.@GetMem][2648]

这些信息本身几乎没有用,因为所有堆分配都经过GetMem。正是调用堆栈将您指向导致调用GetMem. 这就是查明导致泄漏的原因。

于 2012-04-09T10:38:28.807 回答
5

FastMM 无法猜测代码背后的意图,也无法确定导致内存分配的指令应该有相应的指令来释放它。

请记住,FastMM 仅记录在执行代码期间完成的所有内存分配。
它不知道泄漏发生的原因、方式或位置,只是在您的应用程序关闭时您还没有释放这个特定的分配并且一切都应该是干净的。

因此,当报告泄漏时,它实际上是显示的分配。
FastMM 不了解您的应用程序,并且只能显示整个调用链,该调用链导致您在代码中分配内存的特定点(通常是大量 GetMem 调用之一)。
可以通过爬上梯子找到有意义的信息,直到找到需要一些内存的更高级别的指令,例如 aTButton.Create并查看该特定 Button 是否被释放(泄漏其所有内容),或者像 aTMyBadButton.Create创建一些 AltBitmap 但永远不会释放它。
在一种情况下,泄漏是在应用程序代码中创建一个按钮而不释放它,在另一种情况下,它是在TMyBadButton组件代码中。

更新:您可能会发现这个旧的 CodeRage 会话Memory Leaks for Dummies很有用

于 2012-04-09T17:53:57.253 回答