gpt4 book ai didi

delphi - 提供对象作为函数结果内存安全吗?

转载 作者:行者123 更新时间:2023-12-03 15:38:16 24 4
gpt4 key购买 nike

这里我提供了一段简单的代码。

function GetStringList:TStringList;
var i:integer;
begin
Result:=TStringList.Create;
Result.Add('Adam');
Result.Add('Eva');
Result.Add('Kain');
Result.Add('Abel');
end;


procedure ProvideStringList(SL:TStringList);
var i:integer;
Names:TStringList;
begin
Names:=TStringList.Create;
Names.Add('Adam');
Names.Add('Eva');
Names.Add('Kain');
Names.Add('Abel');
SL.Assign(Names);
Names.Free;
end;


procedure TForm1.btn1Click(Sender: TObject);
var SL:TStringList;
i:integer;
begin
SL:=TStringList.Create;
SL.Assign(GetStringList);
for i:=0 to 3 do ShowMessage(SL[i]);
SL.Free;
end;


procedure TForm1.btn2Click(Sender: TObject);
var SL:TStringList;
i:integer;
begin
SL:=TStringList.Create;
ProvideStringList(SL);
for i:=0 to 3 do ShowMessage(SL[i]);
SL.Free;
end;

现在的问题是:函数 GetStringList:Tstringlist 中创建但从未释放的结果对象会发生什么情况? (我调用了 2 次 Create,只调用了 1 次 Free)通过函数提供对象是否内存安全,或者我应该使用过程来完成此任务,其中对象创建和销毁是简单处理的(过程 ProvideStringlist)?我调用了 2 次 Create 和 2 次 Free。或者还有其他解决方案吗?

提前致谢

莱博科

最佳答案

Is it memory safe to provide an object as a function result?

这是可能的,但是需要实现者和调用者的注意。

  1. 让调用者清楚,他控制返回对象的生命周期
  2. 确保函数失败时不会发生内存泄漏。

例如:

function CreateBibleNames: TStrings;
begin
Result := TStringList.Create;
try
Result.Add('Adam');
Result.Add('Eva');
Result.Add('Kain');
Result.Add('Abel');
except
Result.Free;
raise;
end;
end;

但在 Delphi 中,最常见的模式是:

procedure GetBibleNames(Names: TStrings);
begin
Names.BeginUpdate;
try
//perhaps a Names.Clear here
//but I don't use it often because the other
//way is more flexible for the caller

Names.Add('Adam');
Names.Add('Eva');
Names.Add('Kain');
Names.Add('Abel');
finally
Names.EndUpdate;
end;
end;

所以调用者代码可以如下所示:

procedure TForm1.btn1Click(Sender: TObject);
var
Names: TStrings;
i:integer;
begin
Names := CreateBibleNames;
try
for i := 0 to Names.Count -1 do
ShowMessage(Names[i]);
finally
Names.Free;
end;
end;

另一个更常见的版本:

procedure TForm1.btn1Click(Sender: TObject);
var
Names: TStrings;
i:integer;
begin
Names := TStringList.Create;
try
GetBibleNames(Names);
for i := 0 to Names.Count -1 do
ShowMessage(Names[i]);
finally
Names.Free;
end;
end;

(我目前没有编译器,所以可能会有一些错误)

关于delphi - 提供对象作为函数结果内存安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1894217/

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