0

我只是对 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;

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

4

2 回答 2

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;
于 2013-05-30T22:21:14.293 回答
0

我只是找到另一种方法,也许当我创建一个对象而不将它引用到一个变量时,内存管理器在这种情况下无法修复内存泄漏,因为我创建了一个具有相同类型的函数返回和在这种情况下,内存管理器可以使用这个命名变量修复任何内存泄漏......

这是变量的新代码...

function Get_Foundation_infos(): TMyQuery;
var
  q: TMyQuery;
begin
  q := TMyQuery.Create(nil);

  with q do

  begin

    try

      Connection := DataBaseForm.DataBaseForm1.DataBase;

      SQL.Add('SELECT * FROM `foundation_infos` WHERE `Id`=1');
      Execute;

      Result := q;

    except
      on E: Exception do
        Result := nil;
    end;

  end;

end;
于 2013-05-30T22:41:29.740 回答