从函数返回Tfields时内存泄漏

Ous*_*aki 0 memory delphi memory-leaks

我刚才有一个Delphi的问题,我在我的应用程序中创建一个函数,这个函数是这样的

function Get_Foundation_infos(): TFields;
begin
  with TMyQuery.Create(nil) do
  begin
    try
      Connection := DataBaseForm.DataBaseForm1.DataBase;
      SQL.Add('SELECT * FROM `foundation_infos` WHERE `Id`=1');
      Execute;
      Result := Fields;
    except
      on E: Exception do
        Result := nil;
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

问题是我无法TMyquery从函数的外侧释放,因为我有内存泄漏的问题,应用程序在2或3分钟后停止....
但如果我TMyquery在函数内部释放Object,然后我无法从函数调用的外部获取函数结果.

Dav*_*nan 6

您需要确保TMyQuery对象超过它拥有的TFields对象.但是您还必须确保销毁该TMyQuery对象以避免泄漏.

最简单的方法是从函数返回TMyQuery对象,让调用者读取Fields属性.完成后,销毁TMyQuery对象.当然,您将使用try/finally确保异常不会导致泄漏.

function CreateFoundationQuery: TMyQuery;
begin
  Result := TMyQuery.Create(nil);
  try
    Result.Connection := DataBaseForm.DataBaseForm1.DataBase;
    Result.SQL.Add('SELECT * FROM `foundation_infos` WHERE `Id`=1');
    Result.Execute;
  except
    Result.Free;
    raise;
  end;
end;
Run Code Online (Sandbox Code Playgroud)