似乎设置ReportMemoryLeaksOnShutdown := true
对使用Delphi 10.2 Tokyo创建的程序没有任何影响(我在Windows和Linux程序中尝试过)。即使有明显的内存泄漏,也没有任何报告。
有人可以证实吗?还有一种方法可以检查Linux程序中的内存泄漏吗?在Windows上,我可以使用madExcept。
------------------编辑2 ------------------
在Delphi 10.2 ReportMemoryLeaksOnShutdown := true
中,似乎只适用于未标记为控制台应用程序的程序。一旦我注释掉行{$APPTYPE CONSOLE}
,我收到了所需的错误消息(当我在Windows上运行程序时)。
------------------编辑1 ------------------
以下是请求的示例:
program WeakRefTest;
{$APPTYPE CONSOLE}
{$R *.res}
uses
SysUtils;
type
TParent = class;
TChild = class
private
{$IFDEF AUTOREFCOUNT} [Weak] {$ENDIF}
Parent: TParent;
public
constructor Create (const Parent: TParent);
destructor Destroy; override;
end; { TChild }
TParent = class
private
Child : TChild;
public
constructor Create;
destructor Destroy; override;
end; { TParent }
constructor TChild.Create(const Parent: TParent);
begin
inherited Create;
WriteLn ('TChild.Create');
Self.Parent := Parent;
end;
destructor TChild.Destroy;
begin
WriteLn ('TChild.Destroy');
inherited;
end;
constructor TParent.Create;
begin
inherited;
WriteLn ('TParent.Create');
Child := TChild.Create (Self);
end;
destructor TParent.Destroy;
begin
WriteLn ('TParent.Destroy');
inherited;
end;
procedure SubRoutine;
var
Parent : TParent;
begin
Parent := TParent.Create;
WriteLn ('"SubRoutine" exit');
end; { SubRoutine }
begin { WeakRefTest }
ReportMemoryLeaksOnShutdown := true;
try
SubRoutine;
WriteLn ('"WeakRefTest" done');
except
on E: Exception do
WriteLn (E.ClassName, ': ', E.Message);
end;
end.
强制Linux上的内存泄漏注释掉[Weak]
声明中TChild
属性的行。编译Windows时会出现内存泄漏,因为不支持ARC。
当我使用Delphi XE编译并运行代码时,会出现一条消息,内存泄漏:
当我使用Delphi 10.2编译和运行Windows时,没有任何显示。在我在[Weak]
声明中注释掉TChild
属性后使用Linux编译器时也是如此。
答案 0 :(得分:5)
如果从cmd窗口运行控制台应用程序,它将显示有关内存泄漏的相应消息。 内存泄漏报告的行为已更改,并且窗口应用程序显示MessageBox,而控制台应用程序在控制台中获取消息。
在Delphi XE2中,ScanForMemoryLeaks过程中有单个MessageBoxA。 在Delphi 10.2中有自定义过程ShowMessage(AMessage,ATitle:_PAnsiChr);它调用WriteConsoleFile或MessageBoxA。 所以它是设计的,而不是bug(恕我直言)。
比较讨论:Reporting memory leaks on shutdown with a console application