TStringlist 作为函数结果,最小代码序列

Fra*_*anz 4 delphi

如何从函数返回 Stringlist 之前已经讨论过很多次了。我的代码序列版本 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;
Run Code Online (Sandbox Code Playgroud)

是否有任何选项可以通过“无额外代码”来修复版本2中的内存泄漏,这种方法到底有多危险,如果我的字符串列表只是几个字符串项目,这会导致任何失败吗?内存不足问题不会发生吗?

Uwe*_*abe 14

不要使用TStringListas 结果类型,而是使用TArray<string>. 当然,这使得version1过时了。

function GetStrings : TArray<string>;
begin
  var lst := TStringList.Create;
  try
    lst.Add('string A');
    lst.Add('string B');
    Result := lst.ToStringArray;
  finally
    lst.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

  • @MatthiasB 因为 `TArray` 由编译器管理,所以当它超出范围时它会自动释放。不过,在这个例子中,我不会打扰“TStringList”。我会直接填充数组,例如: `function GetStrings : TArray&lt;string&gt;; 开始 SetLength(结果, 2); 结果[0] := '字符串A'; 结果[1] := '字符串B'; 结束;` (3认同)