如何从函数返回字符串列表已经讨论过很多次了。我的代码序列版本1只是一个概述如何做到这一点。
function GetStrings : TStringList;
begin
Result := TStringList.Create;
Result.Add('string A');
Result.Add('string B');
end;
procedure TForm1.Button1Click(Sender: TObject);
var stemp : tStringList;
begin
stemp := GetStrings;
MyListBox.items.addstrings(stemp);
stemp.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
MyListBox.items.addstrings(GetStrings);
end;
是否有任何选项来修复版本2中的内存泄漏“没有额外的代码”,这种方法有多危险,这会导致任何失败,如果我的字符串列表只是几个字符串项,内存不足的问题不会发生?
3条答案
按热度按时间rpppsulh1#
不要使用
TStringList
作为结果类型,而是使用TArray<string>
。当然,这使得 version1 过时了。sbdsn5lh2#
如果你要从函数返回一个新示例化的对象,有一个模式。是这样的:
这个函数的行为就像一个构造函数。它返回一个新示例化的对象,并将所有权传递给调用者。或者它会引发异常,并在引发异常之前进行整理。
如果你使用这种模式,那么你需要以与构造函数示例化对象相同的方式来做,使用众所周知的模式:
至于你的直接问题
是否有任何选项来修复版本2中的内存泄漏“没有额外的代码”,这种方法有多危险,这会导致任何失败,如果我的字符串列表只是几个字符串项,内存不足的问题不会发生?
如果你返回了一个新示例化的对象,那么调用者就不能避免该对象的所有权责任。
laximzn53#
如前所述,您需要向函数和调用者添加额外的代码,以便 * 正确地 * 管理
TStringList
,以确保它始终被释放。一个更好的选择是根本不返回
TStringList
,而是接受调用者想要的任何TStrings
对象,然后填写它,例如: