Delphi 10.2 Tokyoで作成したプログラムでは設定ReportMemoryLeaksOnShutdown := true
しても効果がないようです(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.
[Weak]
Linux でメモリ リークを強制するには、 の宣言で属性を含む行をコメント アウトしますTChild
。Windows 用にコンパイルすると、ARC がサポートされていないため、メモリ リークが発生します。
Delphi XE を使用してコードをコンパイルして実行すると、メモリ リークがあるというメッセージが表示されます。
Delphi 10.2 を使用して Windows 用にコンパイルして実行すると、何も表示されません。[Weak]
の宣言で属性をコメントアウトした後、Linuxコンパイラを使用する場合も同じですTChild
。