Windows任务管理器是否是检测内存泄漏的可靠工具?

时间:2017-12-11 00:41:03

标签: delphi

如果创建了TObject,则必须在最后销毁它。在开发过程中,我发现运行的应用程序在很短的时间后反应缓慢,我注意到在Windows任务管理器中它运行了一段时间后消耗了大量内存。 我做了一些改变,但我仍然看到渐进的内存消耗。该应用程序的内存大约为22,000 Kb,经过反复重绘,涉及创建和销毁对象,它增加到33,000。

这是一个明确的迹象,代码中的某处我没有正确释放对象或是否有其他原因导致内存泄漏?有没有方法可以轻松调试此问题?

我总是非常注意以正确的方式创建和销毁对象,所以我没有看到明显的失败。

2 个答案:

答案 0 :(得分:5)

通过将其添加到项目源代码中,可以在调试模式下关闭时报告内存泄漏:

{$WARN SYMBOL_PLATFORM OFF}
ReportMemoryLeaksOnShutdown := DebugHook <> 0;

Go Project&gt;查看源代码以找到它并在Application.Initialize之前放置上面的行。看起来应该是这样的:

  begin
    {$WARN SYMBOL_PLATFORM OFF}
    ReportMemoryLeaksOnShutdown := DebugHook <> 0;
    {$WARN SYMBOL_PLATFORM ON}
    Application.Initialize;
    Application.MainFormOnTaskbar := True;
    Application.CreateForm(TfrmMain, frmMain);
    Application.Run;
  end.

答案 1 :(得分:4)

检查内存泄漏的最佳方法是使用检查内存泄漏的工具任务管理器仅报告内存使用情况,内存使用可能因合法原因而增加,而不仅仅是内存泄漏。

此外, Delphi 应用程序内存由Delphi内存管理器管理。 Delphi内存管理的工作方式会给人一种内存泄漏的印象,因为从系统中回收未使用的内存的方式(即通常只在必要时,因为重新循环未使用的内存比返回到未使用的内存更有效。操作系统重新分配已返回操作系统的内存。)

仅通过监视内存使用情况来检测内存泄漏时,内存碎片会进一步使问题复杂化。

检查内存泄漏的最简单方法之一是在此区域启用Delphi内存管理器的功能。当Delphi采用 FastMM 内存管理器作为Delphi 2006的默认内存管理器时,这变得更加容易。但是,这个FastMM内存管理器(开源)也可以作为早期的替换内存管理器显式地使用。 Delphi版本。

如果您使用的是Delphi 2006或更高版本,可以在the Delphi documentation中找到有关使用新的默认内存管理器调试功能的一些初学者信息。

对于使用早期版本Delphi的开源版本,网上有很多博客文章,其中this is just one