delphi For-In中的对象清理

yzxexxkh  于 2023-02-15  发布在  其他
关注(0)|答案(1)|浏览(124)

下面的代码是否会从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;
x6yk4ghg

x6yk4ghg1#

是的,TStringList会泄漏。当您使用完TStringList时,必须显式地使用Free,例如:

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;

相关问题