「正確」的方法是讓你建立你自己的規則,如何銷燬。在函數結果中創建對象是很好的,但前提是你遵循自己的嚴格規則。
在你的情況下,SomeFunction
有內存泄漏。首先,創建一個TStringList
,然後如果滿足某些條件,則創建另一個TStringList
,完全忽略第一個。因此,泄漏內存。
DoSomething
不應該是一個返回字符串列表的函數,如果有可能您已經創建了一個。相反,只是讓一個程序...
procedure DoSomething(AList: TStringList);
begin
AList.Add(Something);
end;
一旦你這樣做,那麼SomeFunction
應該是這樣的:
function someFunction: TStringList;
begin
Result:= TStringList.Create;
if someConditionIsTrue then
DoSomething(Result);
//other code
end;
「的stringlists是永遠不會被釋放」
我希望這不是設計。你創建的所有東西都必須在某個時候被釋放,特別是如果你有能夠創建結果的功能。唯一的例外是,如果您創建的應用程序在整個應用程序中都存在,並且無論如何都是非常普遍的。
關於這一點,我曾經在創建一個函數結果確定目標的唯一時間是當我封裝的,否則被多次複製多行代碼。例如,創建一個查詢。
而不是重複這個代碼...
Q:= TADOQuery.Create(nil);
Q.Connection:= MyDatabaseConnection;
Q.SetSomeOtherProperties;
...我把它放在一個函數...
function CreateQuery: TADOQuery;
begin
Result:= TADOQuery.Create(nil);
Result.Connection:= MyDatabaseConnection;
Result.SetSomeOtherProperties;
end;
然後,我可以簡單地調用這個函數每當我需要重複碼...
Q:= CreateQuery;
您已經在第一個代碼示例中單獨發生了內存泄漏,甚至沒有在其他任何地方使用它。首先你創建一個實例,然後你完全忽視這個實例,並創建另一個實例。 –
您的代碼正在創建2個TStringlist實例,這會導致內存泄漏。而某個函數返回的那個會根據'someConditionIsTrue'的值而有所不同。哎呀,你不需要創造一些東西。 – MartynA
沒有「適當」的方式。你需要制定關於**哪一方可以釋放記憶**的約定,並嚴格遵守它。另外,您需要關注編譯器提示,它會向您指出第一個代碼段的問題。 –