在定时器中执行以下代码, 出现内存泄漏,   try
      adoquery1 := Tadoquery.Create(nil);
      adoquery1.Connection := adoconnection1;
      SQLStr := Format(cSQLStr,[TestCode,nDelay]);
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add(SQLStr);
      ADOQuery1.Open;   finally
      ADOQuery1.free; //从任务管理器中看,内存没有回收,偶尔会回收一点
   end;

解决方案 »

  1.   

    大部分时候每次内存增量为4k,是不是Tadoquery控件有内存泄漏问题?
      

  2.   

    另外请问ADOQuery1.free调用后为什么内存没见回收?
      

  3.   

    Delphi编译的程序自带的内存管理器在起作用。内存并没有泄露
    改成以下试试
      adoquery1 := Tadoquery.Create(nil);
      adoquery1.Connection := adoconnection1;
      SQLStr := Format(cSQLStr,[TestCode,nDelay]);
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add(SQLStr);
      try
        ADOQuery1.Open;
      finally
        ADOQuery1.free; //从任务管理器中看,内存没有回收,偶尔会回收一点
      end;
      

  4.   

    情况跟原来一样,差不多内存每次都会涨上去.另外ADOQuery1.Open;后面
    还用了iNum := iNum + ADOQuery1.FieldList[0].AsInteger才到finally的
    会不会有关系
      

  5.   

    注释掉iNum := iNum + ADOQuery1.FieldList[0].AsInteger后
    还是那样
      

  6.   

    也不行啊 跟sql语句会有关系吗
      

  7.   

    const
       cSQLStr = ' select Count(*) from GWCallBill where ProcFlag = 0'
               + ' and task_id in ( select task_id from taskinfo where Test_Code=%d and Delete_Flag=0 )'
               + ' and calltype=0 and (sysdate-record_date)*86400>%d';
      

  8.   

    有可能是其他地方内存泄露啊。
    这里看不出什么问题,另外Free之前的Close可以不用,Destroy里自己知道去Close