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