Чтобы устранить все утечки памяти, я пытаюсь включить библиотеку LeakCheck в DUnit. Проблема в том, что LeakCheck будет сообщать мне об утечках памяти, которые не являются настоящими утечками. Это объекты или другие вещи, выделенные RTL и уничтоженные при выходе из программы.
LeakCheck содержит множество подпрограмм, которые позволяют указать, что следует игнорировать, и я смог использовать их для игнорирования большинства таких «утечек». Однако я не знаю, как избавиться от одного, в частности:
program LeakCheckMemLeak;
{$APPTYPE CONSOLE}
uses
LeakCheck, TestFramework, LeakCheck.DUnit, LeakCheck.Utils, LeakCheck.Setup.Trace, System.SysUtils,
Forms, System.Classes;
{$R *.RES}
procedure LeakMemory;
var
LThread: TThread;
begin
LThread := TThread.Create(True);
LThread.Free;
end;
procedure DetectLeak;
var
Snapshot: TLeakCheck.TSnapshot;
Report: LeakString;
begin
Snapshot.Create;
LeakMemory;
Report := TLeakCheck.GetReport(Snapshot.Snapshot);
try
Writeln(string(Report));
finally
Report.Free;
end;
end;
begin
Application.Initialize;
DetectLeak;
Readln;
end.
Создание экземпляра TThread
(изначально это был TThread.CreateAnonymousThread
, но результаты те же) вызывает 64-байтовую утечку памяти:
Total allocation count: 297 (12592 B)
Leak detected 02BB3DC0 size 64 B
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E8 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ????????????????????????????????
Stack trace when the memory block was allocated:
$00406E76 - LeakCheckMemLeak.exe - System.AllocMem + $A (4562 +25)
$004C4A53 - LeakCheckMemLeak.exe - System.Classes.TThread.WaitFor + $8F (15565 +23)
$005E4EB0 - LeakCheckMemLeak.exe - LeakCheckMemLeak.DetectLeak + $34 (24 +3)
$005ED5B9 - LeakCheckMemLeak.exe - LeakCheckMemLeak.LeakCheckMemLeak + $29 (35 +3)
$763E343D - kernel32.dll
$76F19832 - ntdll.dll
В других случаях LeakCheck предоставил мне имя класса, из которого произошел утечка экземпляра, чтобы я мог добавить его в список игнорируемых, но в этом случае это не так. Как подавить эту "утечку"?
Одно примечание: эта и другие утечки, с которыми я столкнулся, не происходят в приложении с графическим интерфейсом. Я предполагаю, что RTL предварительно выделяет память для большинства этих объектов перед запуском тестов.
System.RegisterExpectedMemoryLeak()
. Передайте адреса любых блоков памяти, которые вы хотите игнорировать в отчетах об утечках. - person Remy Lebeau   schedule 19.07.2018