【问题标题】:Free TStringlist as function result?释放 TStringlist 作为函数结果?
【发布时间】:2020-09-08 19:41:30
【问题描述】:

如果我调用的函数返回TStringList(带有TStringList.Create)并且我没有将它分配给变量而是直接使用它一次(如Data:=MyTStringFunction.Values['data'];),我是否会出现内存泄漏或将TStringList 会自动释放吗?

【问题讨论】:

  • 您可以考虑返回 TStringArray(= 字符串数组)而不是字符串列表。这将被隐式处理。

标签: delphi delphi-10.3-rio


【解决方案1】:

如果函数创建了一个新的字符串列表,那么你的代码就会泄露。

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)上运行,则不会泄漏。但如果代码必须在非 ARC 平台(Windows、Linux、macOS)上运行,或者曾经升级到 Delphi 10.4,则需要调用 Free。这样的代码将在所有平台上正常工作。

【讨论】:

  • 用你的评论更新了我的问题
  • 我添加了 ARC 编译器的注释,因为在 Delphi 10.3 中移动平台上的情况有所不同,但在 10.4 中 ARC 编译器不再存在,因此无论如何您都需要更改该代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
相关资源
最近更新 更多