[英]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.