“ReportMemoryLeaksOnShutdown”在Delphi 10.2 Tokyo中不起作用?

时间:2017-06-16 08:45:02

标签: delphi delphi-10.2-tokyo

似乎设置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编译并运行代码时,会出现一条消息,内存泄漏: Message displayed when compiled with Delphi XE

当我使用Delphi 10.2编译和运行Windows时,没有任何显示。在我在[Weak]声明中注释掉TChild属性后使用Linux编译器时也是如此。

1 个答案:

答案 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