用ToBytes方法替换AnsiString对TBytes的硬类型强制转换(字符串数组)(见下文)后,Delphi报告没有内存泄漏-Free Pascal 2.6.2然而显示泄漏,以防TBytes值被传递给带有TBytes方法的方法。类型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

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

最佳答案

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

var
  Tmp: TBytes;
....
Tmp := ToBytes(...);
Send(Tmp);

09-17 02:35