如果创建了TObject,则必须在最后销毁它。在开发过程中,我发现运行的应用程序在很短的时间后反应缓慢,我注意到在Windows任务管理器中它运行了一段时间后消耗了大量内存。 我做了一些改变,但我仍然看到渐进的内存消耗。该应用程序的内存大约为22,000 Kb,经过反复重绘,涉及创建和销毁对象,它增加到33,000。
这是一个明确的迹象,代码中的某处我没有正确释放对象或是否有其他原因导致内存泄漏?有没有方法可以轻松调试此问题?
我总是非常注意以正确的方式创建和销毁对象,所以我没有看到明显的失败。
答案 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。