Возврат 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 не нуждается во владельце, который будет создан. Для объектов, которые нуждаются во владельце - владелец ответственен и должен уничтожить объект.
Комментарии