Кажется, что настройка 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, появляется сообщение об утечке памяти:
Когда я компилирую и запускаю для Windows с помощью Delphi 10.2, ничего не появляется. То же самое при использовании компилятора Linux после того, как я закомментировал атрибут [Weak]
в объявлении TChild
.
var p : Pointer; begin ReportMemoryLeaksOnShutdown := true; GetMem(p, 100); end.
- person Olaf Hess   schedule 16.06.2017{APPTYPE CONSOLE}
, появляется сообщение об утечке памяти. Я сообщу об ошибке. Спасибо, что поставили меня на правильный путь. - person Olaf Hess   schedule 16.06.2017