免费的 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
需要调用。这样的代码将在所有平台上正常工作。
如果一个函数我调用 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
需要调用。这样的代码将在所有平台上正常工作。