Delphi中检测内存泄漏的最佳工具是什么?

27

最好的检测内存泄漏的工具是什么?

免费或者付费都可以。

谢谢。


有人应该编辑一下,将Delphi放入标题中。 - Dana Robinson
1
已经提问过了:https://dev59.com/V3VC5IYBdhLWcg3wcgud - lkessler
新的工具Deleaker现在支持Delphi了:https://www.youtube.com/watch?v=suyJfoSeRrQ - Artem Razin
9个回答

40

FastMM是一个免费(源代码可用)的内存泄漏检测器,已经集成在最新的Delphi版本中。我从未需要其他东西。

编码时限制内存泄漏的可能性要比之后发现它们要好得多。以下是一些提示:

始终在代码中使用try和finally来释放创建的对象。最好立即编写此代码,然后编写使用对象的代码。更好的方法是利用IDE功能,例如代码模板。

仅在绝对必要时使用返回动态分配对象的函数。通常最好将对象作为参数传递而不是创建和返回它们。例如:

procedure getChoices(var AChoices: TStrings);

会比......好得多。

function getChoices: TStrings;

因为没有意外泄漏已创建的 TStrings 对象的潜在可能性。


8
您可以通过设置ReportMemoryLeaksOnShutdown := True来打开它;或者从sourceforge获取最新版本,并在.inc文件中设置正确的选项。 - Lars Truijens
使用 getChoices,尝试执行...最后释放资源; 结束; - inzKulozik
1
@inzKulozik:是的,它不需要导致泄漏,但潜在的风险是存在的。另一方面,第一个版本可能可以在不创建另一个TStrings对象的情况下工作。例如,您可以传递TListBox或TMemo的Items。 - mghie
5
更好的方法是:procedure getChoices(const AChoices: TStrings);你仍然可以修改AChoices的属性,但不能将其赋值给另一个对象。 - Gerry Coll
@LarsTruijens 我以前不知道ReportMemoryLeaksOnShutdown,谢谢 :) - user741875
AChoices上不需要使用var,因为它已经是一个引用类型。 - dan-gph

20

我们在Delphi 7中使用EurekaLog。它是一个异常处理组件,可以提供非常详细的异常信息(包括调用堆栈!环境变量等),即使是访问冲突异常。但另一个很棒的功能是,你可以告诉它在内存泄漏时出错,这将显示分配内存/对象的确切代码行!它是一个商业产品,但我仍然强烈推荐使用。


1
只是不要忘记,EL首先是异常跟踪器 ;) 因此,与FastMM(请参见mghie的答案)等功能相比,其内存泄漏功能受到限制。 - Alex
我曾考虑购买EurekaLog而不是MadExcept,因为它可以报告内存泄漏。但不幸的是,它无法捕获使用运行时包编译的项目中的内存泄漏。所以对我来说,我不能使用它。 - lkessler
更新:我刚刚购买了EurekaLog。我成功地让我的产品编译而不需要运行时包。太棒了。 - lkessler

14

AQTime非常好用。它还可以进行性能分析等其他操作。而且它不需要对您的代码进行任何更改。当然,使用调试信息编译可以获得更好的结果。


同意 AQTime 的观点,即使是 Delphi,尤其是所有的 Visual Studio。每一分钱都值得。 - OregonGhost
2
AQTime的好处在于它可以与许多编译器一起使用。它可能更难使用,而且与FastMM不同,它不能在任何地方安装并需要代码插装。但是它可以帮助精确定位泄漏问题。我通常先使用FastMM,然后再用AQTime深入挖掘。 - user160694

14

我建议使用完整的FastMM4版本而不是Delphi版本。完整版本将提供一个详细的报告记录到文件中,而不是对话框。结合自制的"内存泄漏日志文件差异"工具,你就可以准备好进行令人激动的错误追踪。


4
您可以使用FastMMUsageTracker.pas文件,它创建一个单独的窗口显示内存使用情况,每秒钟更新一次左右。 - mjn

10

我总是使用ReportMemoryLeaksOnShutdown := (DebugHook <> 0);这样只有在我调试时才会报告内存泄漏。

PS:我想把这个放在评论里,但我还没有权限...


7

您可能想看一下这个CodeRage 2会议的内容:《菜鸟斗内存泄漏》。该会议主要展示了如何使用FastMM来预防/检测Delphi中的内存泄漏。虽然是针对D2007的,但对D2009仍然适用。


7

FastMM非常好用。我知道有3或4个免费的内存管理器适用于Delphi。通常只需要三行代码就可以将它们嵌入到项目中,因此检查它们不到一个小时就可以完成。


4

我使用 MadExcept,因为它个人使用免费。


1

3
我想知道你与所涉及的产品有关联的可能性有多大... - Andrew Barber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接