«Правильный» подход заключается в том, чтобы вы установили свои собственные правила уничтожения вещей. Можно создавать объекты в результате функции, но только если вы следуете собственным строгим правилам.
В вашем случае 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;
"Списки строк никогда не освобождаются"
Я надеюсь, что это не по замыслу. Все, что вы создаете, в какой-то момент должно быть освобождено, особенно если у вас есть функции, создающие результат. Единственным исключением является случай, когда вы создаете что-то, что живет на протяжении всего времени работы приложения, и даже в этом случае их освобождение в любом случае является крайней точкой соприкосновения.
В этой заметке единственный раз, когда я когда-либо создавал объект в результате функции, это когда я инкапсулирую несколько строк кода, которые в противном случае дублировались бы много раз. Например, создание запроса.
Вместо того, чтобы повторять этот код...
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;
05.07.2016