Free Discal中的内存泄漏是由带有'pointer'参数的方法引起的

mjn*_*mjn 7 memory-leaks freepascal fpc compiler-bug

使用ToBytes方法(见下文)将AnsiString的硬类型转换替换为TBytes(字符串数组)后,Delphi报告没有内存泄漏 - 但是,如果将TBytes值传递给具有a的方法,则Free Pascal 2.6.2会显示泄漏类型的参数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. 
Run Code Online (Sandbox Code Playgroud)

内存泄漏报告:

Call trace for block $001C5CC0 size 12   $00401586  TOBYTES,  line 10
of project1.lpr   $00401622  main,  line 21 of project1.lpr
Run Code Online (Sandbox Code Playgroud)

如果我将Send方法更改为采用TBytes类型的参数,则内存泄漏将消失.

Dav*_*nan 4

这是一个编译器错误。托管类型TBytes具有引用计数生命周期。编译器应该创建一个隐式局部变量,该变量被分配给 . 返回的数组ToBytes。您需要通过存储到显式本地来解决这个问题:

var
  Tmp: TBytes;
....
Tmp := ToBytes(...);
Send(Tmp);
Run Code Online (Sandbox Code Playgroud)