0

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 XE でコンパイルしたときに表示されるメッセージ

Delphi 10.2 を使用して Windows 用にコンパイルして実行すると、何も表示されません。[Weak]の宣言で属性をコメントアウトした後、Linuxコンパイラを使用する場合も同じですTChild

4

1 に答える 1