Внешний вид сайта:

Возврат TStringList из функции Delphi

Функции Delphi могут возвращать любые значения объектов (типа TStringList или TButton). Но нужно быть осторожным при вызове такой функции. Если Вы не знаете как написать функцию 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 не нуждается во владельце, который будет создан. Для объектов, которые нуждаются во владельце - владелец ответственен и должен уничтожить объект.

Комментарии

Нет комментариев. Ваш будет первым!