Я также посмотрел System.pas и заметил, что вызов GetMem в _DynArrayCopyRange поддерживает ваш анализ:
выделенный размер = количество * размер элемента
+ 2 * Sizeof (Longint)
. Так что, возможно, числа, которые вы получаете из диспетчера задач, не очень точны. Вы можете попробовать Pointer(someDynArray) := nil
и проверить, какой размер утечки памяти сообщает FastMM для получения более надежных цифр.
Редактировать: Я сделал небольшую тестовую программу:
program DynArrayLeak;
{$APPTYPE CONSOLE}
uses
SysUtils;
procedure Test;
var
arr: array of Integer;
i: Integer;
begin
for i := 1 to 6 do
begin
SetLength(arr, i);
Pointer(arr) := nil;
end;
end;
begin
ReportMemoryLeaksOnShutdown := True;
Test;
end.
Это дает
An unexpected memory leak has occurred. The unexpected small block leaks are:
1 - 12 bytes: Unknown x 1
13 - 20 bytes: Unknown x 2
21 - 28 bytes: Unknown x 2
29 - 36 bytes: Unknown x 1
, который поддерживает 8-байтовую теорию служебных данных.