Delphi :发生意外内存泄漏

c9x0cxw0  于 2023-06-29  发布在  其他
关注(0)|答案(3)|浏览(140)

在 Delphi 中,我已经配置了报告内存泄漏:

{$IFDEF Debug}
  ReportMemoryLeaksOnShutdown := true;
  {$ENDIF}

退出程序后,我得到以下消息:

我的程序很大,我不知道如何找到我已经创建但没有释放的TStringList。
不幸的是 Delphi 没有垃圾收集器。
如果我在我的项目中搜索TStringList,我会发现大约500次。把它们都检查一遍没有任何意义。

如何找到我忘记释放的变量?

k4aesqcs

k4aesqcs1#

有一些工具可以帮助您查找内存泄漏(AQTime,EurekaLog,...)。
Example. See EurekaLog,下载演示/试用版并进行测试。这个工具可以给予你一些关于泄漏的信息,以及产生泄漏的源代码的详细信息。

“详细信息”(包括应用程序中的调试信息)可以帮助您检测错误行:

xdnvmnnf

xdnvmnnf2#

下面的软件可以帮助查找内存泄漏:
https://github.com/shadow-cs/delphi-leakcheck
下面是要遵循的步骤:

  1. cd C:\Delphi
    git clone https://github.com/shadow-cs/delphi-leakcheck
    1.将路径C:\Delphi\delphi-leakcheck\Source添加到 Delphi 库路径(工具/选项/...)
    1.在MyProject.dpr文件的开头添加以下代码:
    代码:
uses
  // LeakCheck, // Does not need do be defined here (LeakCheck.Report will do it) unless you want to reference it from the DPR
  LeakCheck.Report, // Me first! - I don't have any dependencies but LeakCheck so I finalize after all other units
  LeakCheck.Setup.Trace, // (Optional) Then me - Run setup to configure stack tracing for us
  LeakCheck.Report.FileLog, // Then me - I'm the one that pulls some dependencies and have all the functionality

1.编译并启动程序
1.定期退出程序
退出可能需要几分钟(请耐心等待...)
1.您将看到一个消息框,告诉您创建了一个文件C:\Delphi\MyProject\MyProject.log
此日志文件包含创建变量的函数(及其调用堆栈)的名称。它不是未释放变量的名称,但至少是函数和该函数中的行号。

这个方法在几分钟内解决了我的问题。
额外的好处:这个软件是完全免费的-你不需要为它支付任何费用

ffvjumwh

ffvjumwh3#

使用 Delphi 的一个内存分析器来获取泄漏的调用堆栈:

在查看调用堆栈之后,您有机会了解哪些对象正在泄漏。

相关问题