首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi: TAdoQuery内存泄漏?

Delphi: TAdoQuery内存泄漏?
EN

Stack Overflow用户
提问于 2010-10-27 21:40:06
回答 6查看 4.2K关注 0票数 1

我正在使用Delphi5和ADO开发一个小型糖尿病程序。我像这样做了一个小查询:

代码语言:javascript
复制
function GetLowestGlucoseLevel(StartDate:string;EndDate:string): Integer;
var
  Q:TADOQuery;
begin
   try
      Q:=TADOQuery.Create(Application); //Separate unit, owner set to App
      Q.Connection:=dtMod.ADOCon;
      Q.DisableControls;
      Q.Close;
      Q.SQL.Clear;
      Q.SQL.Add('SELECT Min(qGlucose.Glucose) AS MinOfGlucose from qGlucose');
      Q.Parameters[0].Value:=StartDate;
      Q.Parameters[1].Value:=EndDate;
      Q.Open;

      Result:=Q.FieldByName('MinOfGlucose').AsInteger;

      Q.Close;
    finally
      Q:=nil;
      Q.Free; 
    end; 
end;

查询运行正常,并按预期返回结果。然而,当我检查Windows任务管理器时,内存使用量在查询后继续上升,而不是下降。

如何解决这个问题?

谢谢!

EN

回答 6

Stack Overflow用户

发布于 2010-10-27 21:51:06

您首先将TADOQuery设置为nil,然后在nil变量上调用Free (不做任何操作),从而泄漏了nil

票数 13
EN

Stack Overflow用户

发布于 2010-10-27 22:20:29

  • 你安装Delphi5更新了吗?已知RTM实现存在问题。
  • 使用FastMM4,它应该也适用于Delphi5,并告诉您更多关于泄漏位置的信息。
票数 4
EN

Stack Overflow用户

发布于 2011-08-14 08:14:59

Delphi方法:

代码语言:javascript
复制
function GetLowestGlucoseLevel(const StartDate:string; const EndDate:string): Integer;
var
  Q:TADOQuery;

begin

    Q:=TADOQuery.Create(nil); //(nil) because local use only. Placed before try\finally block 
                              //because if it fails to .create then there would be no object to
                              //.Free 
    try

      Q.Connection := dtMod.ADOCon;

      //------can erase these------
      //Q.DisableControls; //No controls attached so unnecessary
      //Q.Close;           //Q is local and was never opened so no need to close
      //Q.SQL.Clear;       //Q is local and was never filled so no need to clear

      Q.SQL.Add('SELECT Min(qGlucose.Glucose) AS MinOfGlucose from qGlucose');
      Q.Parameters[0].Value:=StartDate;
      Q.Parameters[1].Value:=EndDate;
      Q.Open;

      Result := Q.FieldByName('MinOfGlucose').AsInteger;

      Q.Close;

    finally 

      Q.Free;

      //Q := nil          //not needed because Q's scope is local

    end; 
end;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4033872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档