gpt4 book ai didi

memory-leaks - 参数为 'pointer' 的方法导致 Free Pascal 中的内存泄漏

转载 作者:行者123 更新时间:2023-12-04 12:21:17 24 4
gpt4 key购买 nike

用 ToBytes 方法(见下文)将 AnsiString 的硬类型转换替换为 TBytes(字符串数组)后,Delphi 报告没有内存泄漏 - Free Pascal 2.6.2 然而显示泄漏,以防 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);

关于memory-leaks - 参数为 'pointer' 的方法导致 Free Pascal 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22181340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com