Возврат TStringList из функции Delphi
Кто должен освобождать память?
В Delphi для Win32 каждый объект, созданный вручную должен быть освобожден вручную. Это просто. Если Вы не освободите объект, который Вы создаете, Ваша программа будет занимать память и в конце концов съест всю память, которую имеет Windows.
Вот простая функция, которая возвращает объект TStringList:
function GetStringList: TStringList;
begin
result := TStringList.Create;
result.Add('an item') ;
end;
Выглядит весьма просто.
Обратите внимание, что функция возвращает TStringList, так как переменная result объявлена неявно в каждой функции и это переменная TStringList.
Когда Вы выходите из функции, Вы создаете объект TStringList, не используемый в памяти. Кто-то должен освободить объект перед завершением приложения.
Вызов функции GetStringList будет вызываться из другой части кода:
var
sl : TStringList;
begin
sl := GetStringList;
try
ShowMessage(sl[0]) ;
// или, например,
// ListBox1.Items.Assign(sl) ;
finally
sl.Free;
end;
end;
Вот что важно: мы имеем переменную TStringList (sl), которая получает результат функции GetStringList, делает что-либо с этим результатом, и удаляет список из памяти, таким образом предотвращая учечку памяти.
Поэтому важно! Когда функция возвращает объект - всегда удостоверьтесь, что объект освобождается из памяти, когда он больше не нужен!
Обратите внимание, что TStringList не нуждается во владельце, который будет создан. Для объектов, которые нуждаются во владельце - владелец ответственен и должен уничтожить объект.
Комментарии