簡體   English   中英

TStringlist 為 function 結果,最小代碼序列

[英]TStringlist as function result, minimal code sequence

如何從 function 返回一個 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;

是否有任何選項可以使用“無額外代碼”修復版本 2 中的 memory 泄漏,這種方法到底有多危險,如果我的字符串列表只是幾個字符串項,這會導致任何失敗,memory 問題不會發生嗎?

不要使用TStringList作為結果類型,而是使用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;

如果您要從 function 返回新實例化的 object,則有一個模式。 它是這樣的:

function GetStrings: TStringList;
begin
  Result := TStringList.Create;
  try
    Result.Add('string A');
    Result.Add('string B');
  except
    Result.Free;
    raise;
  end;
end;

這個 function 的行為就像一個構造函數。 要么它返回一個新實例化的 object,並將所有權傳遞給調用者。 或者它引發異常,並在引發異常之前進行整理。

如果您使用此模式,那么您需要按照與構造函數實例化的 object 相同的方式來執行此操作,使用眾所周知的模式:

procedure TForm1.Button1Click(Sender: TObject);
var 
  temp: TStringList;
begin
  temp := GetStrings;
  try
    MyListBox.Items.AddStrings(temp);
  finally
    temp.Free;
  end;
end;

現在,至於你的直接問題:

是否有任何選項可以使用“無額外代碼”修復版本 2 中的 memory 泄漏,這種方法到底有多危險,如果我的字符串列表只是幾個字符串項,這會導致任何失敗,memory 問題不會發生嗎?

如果您確實返回了一個新實例化的 object,那么調用者就無法避免對該 object 的所有權責任。

正如提到的其他人一樣,您需要向 function 和調用者添加額外的代碼,以便正確管理TStringList以確保它始終被釋放。

一個更好的選擇是根本不返回TStringList ,而是接受調用者想要的任何TStrings object 並填寫它,例如:

procedure GetStrings(Strings: TStrings);
begin
  Strings.BeginUpdate;
  try
    Strings.Add('string A');
    Strings.Add('string B');
  finally
    Strings.EndUpdate;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetStrings(MyListBox.Items);
end;

如何從 function 返回一個 Stringlist 之前已經討論過很多次了。 我的代碼序列版本 1 只是概述了如何做。 訪問這里https://developershelparticles.blogspot.com/2023/06/blog-post_753.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM