gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:55:09 24 4
gpt4 key购买 nike

对于 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com