После замены жестких типов приведения AnsiString в TBytes (массив строки) с помощью метода ToBytes (см. Ниже) Delphi сообщила об отсутствии утечек памяти - Free Pascal 2.6.2 однако показывает утечку в случае, если значение TBytes передается методу с параметром типа Pointer
.Ошибка утечки памяти в Free Pascal, вызванная методами с параметром 'pointer'
Следующий код утечки памяти: отчет утечки
program project1;
{$mode delphi}
uses
SysUtils;
function ToBytes(const AValue: AnsiString): TBytes;
begin
SetLength(Result, Length(AValue)); // <-- leak (ine 10)
if Length(AValue) > 0 then
Move(AValue[1], Result[0], Length(AValue));
end;
procedure Send(P: Pointer);
begin
end;
begin
Send(ToBytes('test'));
SetHeapTraceOutput('heaptrace.log');
end.
Память:
Call trace for block $001C5CC0 size 12 $00401586 TOBYTES, line 10
of project1.lpr $00401622 main, line 21 of project1.lpr
Если изменить метод отправки принять аргумент терабайт типа, утечка памяти исчезает.
Зарегистрировано в Free Pascal/Lazarus Bug Tracker http://bugs.freepascal.org/view.php?id=25825 – mjn