delphi - 项目中的匿名方法泄漏内存

标签 delphi memory-leaks delphi-2009

对于 Web 框架,我第一次尝试匿名方法,并遇到了内存管理问题。

如何修复此内存泄漏(Delphi 2009)?

泄漏消息是:

13 - 20 bytes: Project27$ActRec x 1

program Project27;

type
  TTestProc = reference to procedure;

  procedure CallMe(Proc: TTestProc);
  begin
  end;

begin
  CallMe(procedure begin end);

  ReportMemoryLeaksOnShutdown := True;
end.
<小时/>

无论begin和end之间有多少个匿名方法,都会出现相同的泄漏消息“Project27$ActRec x 1”,我猜测泄漏是针对TTestProc类型的,而不是针对单个匿名程序的泄漏

program Project27;

type
  TTestProc = reference to procedure;

  procedure CallMe(Proc: TTestProc);
  begin
  end;

begin

  ReportMemoryLeaksOnShutdown := True;

  CallMe(procedure begin end);

  CallMe(procedure var A: Integer; begin A := 42 ; end);

end. 

最佳答案

当您在过程或函数中声明匿名方法时,当该例程超出范围时,它会被清除。 (这过于简单化了,但对于当前的讨论来说已经足够了。)问题是 DPR 的主要例程并没有“超出范围”。相反,Delphi 编译器会在其末尾插入一个对 System.Halt 的隐藏调用,该调用永远不会返回。

所以如果你这样写,你将会收到内存泄漏通知。您可以通过将匿名方法创建放入正常退出的例程中来修复它,如下所示:

program Project27;

type
  TTestProc = reference to procedure;

  procedure CallMe(Proc: TTestProc);
  begin
  end;

  procedure Test;
  begin
    CallMe(procedure begin end);
  end;

begin
  Test;
  ReportMemoryLeaksOnShutdown := True;
end.

关于delphi - 项目中的匿名方法泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9282103/

相关文章:

德尔福2009 : How do I prevent network application from leaking critical section?

德尔福2009 : Is there a keyboard shortcut for searching the Structure panel?

delphi - 如何将 D2009 .groupproj 文件转换为 D2006 .bdsgroup 文件?

delphi - 判断字符串是否不包含数字

delphi - Delphi IdFTP超时

regex - Delphi 正则表达式的最大模式 "separation"?

c++ - 如何摆脱第三方框架(gstreamer)中的内存泄漏

delphi - 如何删除类别面板控件中的或更改“水平分隔符”?

javascript - 如何清除缓存中下载的图像

c# - C# 中的内存泄漏