Будет ли следующий код иметь утечку памяти из 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;
Кстати. Я не понимаю заголовок в вашем сообщении. Уборки нигде нет.
@TomBrunberg: ОП, вероятно, задается вопросом, циклы Delphi for in автоматически освобождают (очищают) объект, созданный в части in.
Уничтожение экземпляра TStringList после итерации будет означать, что вы никогда не сможете повторить его дважды. Возможно, Вольфганга ввел в заблуждение тот факт, что динамически созданный перечислитель, который фактически работает со списком строк во время цикла for-in, будет автоматически освобожден.
Язык гарантирует очистку перечислителя. Но ничто не очищает коллекцию.
@AndreasRejbrand Вы правы, теперь все ясно.
Да, 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;
Да, будет, но не верьте мне, проверьте себя, введя ReportMemoryLeaksOnShutdown := True; в файл проекта, непосредственно перед Application.Initialize;