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类型的参数,则内存泄漏将消失.
这是一个编译器错误。托管类型TBytes具有引用计数生命周期。编译器应该创建一个隐式局部变量,该变量被分配给 . 返回的数组ToBytes。您需要通过存储到显式本地来解决这个问题:
var
Tmp: TBytes;
....
Tmp := ToBytes(...);
Send(Tmp);
Run Code Online (Sandbox Code Playgroud)