ReportMemoryLeaksOnShutdown не работает в 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, появляется сообщение об утечке памяти: Сообщение, отображаемое при компиляции с помощью Delphi XE

Когда я компилирую и запускаю для Windows с помощью Delphi 10.2, ничего не появляется. То же самое при использовании компилятора Linux после того, как я закомментировал атрибут [Weak] в объявлении TChild.


person Olaf Hess    schedule 16.06.2017    source источник
comment
Отправить отчет об ошибке в Embarcadero   -  person David Heffernan    schedule 16.06.2017
comment
Я только что протестировал (в проекте Windows FMX), и он отлично работает. Можете ли вы привести пример?   -  person Dsm    schedule 16.06.2017
comment
Вы должны продемонстрировать на минимально воспроизводимом примере   -  person Disillusioned    schedule 16.06.2017
comment
Так что отправьте отчет об ошибке уже.   -  person David Heffernan    schedule 16.06.2017
comment
@Крейг Янг: Вот: var p : Pointer; begin ReportMemoryLeaksOnShutdown := true; GetMem(p, 100); end.   -  person Olaf Hess    schedule 16.06.2017
comment
@OlafHess Я видел это. Это значительное улучшение вашего вопроса. Я согласен, что ваш код должен сообщать об утечке памяти. К сожалению, у меня нет необходимой версии Delphi для подтверждения/опровержения. Я также не уверен, есть ли какая-то причуда в настройках проекта, которая может вызывать неожиданное поведение.   -  person Disillusioned    schedule 16.06.2017
comment
FWIW, ReportMemoryLeaksOnShutdown работает только в Windows.   -  person Dalija Prasnikar    schedule 16.06.2017
comment
@Dsm: Когда я раскомментирую строку {APPTYPE CONSOLE}, появляется сообщение об утечке памяти. Я сообщу об ошибке. Спасибо, что поставили меня на правильный путь.   -  person Olaf Hess    schedule 16.06.2017
comment
@OlafHess ваш пример работает нормально в приложении VCL. Я получаю то же сообщение, что и в вашем вопросе. Пример с GetMem также дает правильное сообщение.   -  person zdzichs    schedule 16.06.2017


Ответы (1)


Если вы запустите консольное приложение из окна cmd, оно покажет соответствующее сообщение об утечке памяти. Поведение отчета об утечке памяти изменилось, и MessageBox отображается для оконных приложений, а консольные приложения получают сообщение в console.

В Delphi XE2 в процедуре ScanForMemoryLeaks был единственный MessageBoxA. В Delphi 10.2 есть пользовательская процедура ShowMessage(AMessage, ATitle: _PAnsiChr); который альтернативно вызывает WriteConsoleFile или MessageBoxA. Так задумано, а не багом (ИМХО).

Сравните обсуждение: Сообщение об утечке памяти при завершении работы с консольным приложением< /а>

person zdzichs    schedule 16.06.2017