Очистка объекта в For-In

Будет ли следующий код иметь утечку памяти из TStringlist?

function TDemo.GetList:TStringlist;

begin
 Result:=TStringlist.Create;
{...}
end;

procedure TMain.Something;

Var
 S:String;

begin
 For S IN Demo.GetList do begin
 end;
end;

Да, будет, но не верьте мне, проверьте себя, введя ReportMemoryLeaksOnShutdown := True; в файл проекта, непосредственно перед Application.Initialize;

Tom Brunberg 14.02.2023 19:39

Кстати. Я не понимаю заголовок в вашем сообщении. Уборки нигде нет.

Tom Brunberg 14.02.2023 19:54

@TomBrunberg: ОП, вероятно, задается вопросом, циклы Delphi for in автоматически освобождают (очищают) объект, созданный в части in.

Andreas Rejbrand 14.02.2023 21:38

Уничтожение экземпляра TStringList после итерации будет означать, что вы никогда не сможете повторить его дважды. Возможно, Вольфганга ввел в заблуждение тот факт, что динамически созданный перечислитель, который фактически работает со списком строк во время цикла for-in, будет автоматически освобожден.

Uwe Raabe 14.02.2023 22:25

Язык гарантирует очистку перечислителя. Но ничто не очищает коллекцию.

David Heffernan 15.02.2023 00:20

@AndreasRejbrand Вы правы, теперь все ясно.

Tom Brunberg 15.02.2023 11:06
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
0
6
129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, TStringList протечет. Вы должны явно указать Free TStringList, когда закончите его использовать, например:

function TDemo.GetList: TStringList;
begin
  Result := TStringlist.Create;
  ...
end;

procedure TMain.Something;
var
  S: String;
  SL: TStringList;
begin
  SL := Demo.GetList;
  try
    for S in SL do begin
      ...
    end;
  finally
    SL.Free;
  end;
end;

Вот почему возвращение объекта Create в качестве возвращаемого значения функции обычно не является хорошей идеей. В этом конкретном примере вместо этого возврат массива был бы альтернативным решением, которое не требует ручной очистки, например:

function TDemo.GetList: TArray<String>;
begin
  SetLength(Result, ...);
  ...
end;

procedure TMain.Something;
var
  S: String;
begin
  for S in Demo.GetList do begin
    ...
  end;
end;

Другие вопросы по теме