免费的 TStringlist 作为函数结果?

Free TStringlist as function result?

如果一个函数我调用 returns 一个 TStringList(带有一个 TStringList.Create)并且我没有将它分配给一个变量而是直接使用它一次(比如 Data:=MyTStringFunction.Values['data'];) 我会发生内存泄漏还是会自动释放 TStringList?

如果该函数创建一个新的字符串列表,那么您的代码将会泄漏。

function MyTStringFunction: TStringList;
begin
  // constructing new string list
  Result := TStringList.Create;
  ...
end;

您需要将返回列表的值存储在一个变量中,并在完成后Free它。

var
  List: TStringList;

List := MyTStringFunction;
try
  Data := List.Values['data'];
finally
  List.Free;
end;

注意:由于 Delphi 10.3 Rio 仍然使用 ARC object management 作为其移动编译器,如果以上代码 运行 严格适用于 ARC 平台(iOS,Android) 则不会泄漏。但是,如果代码必须在 non-ARC 平台(Windows、Linux、macOS)上 运行,或者曾经升级到 Delphi 10.4,那么 Free 需要调用。这样的代码将在所有平台上正常工作。