procedure TMainForm.Button1Click(Sender: TObject);
var
   ADOCjcx:TADOQuery;
begin
    ADOCjcx:=TADOQuery.Create(self);
    ADOCjcx.Connection:=myDataMd.ADOConnection1;
    ADOCjcx.SQL.Add('select * from tbA');
    ADOCjcx.Open;
end;
Button1Click在程序中会多次点击,每次都为ADOCjcx分配内存,实际造成了内存泄漏。
可以这样做防止内存泄漏:
var
   ADOCjcx:TADOQuery;
procedure TMainForm.Button1Click(Sender: TObject);
begin
    FreeAndNil(ADOCjcx);
    ADOCjcx:=TADOQuery.Create(self);
    ADOCjcx.Connection:=myDataMd.ADOConnection1;
    ADOCjcx.SQL.Add('select * from tbA');
    ADOCjcx.Open;
end;

解决方案 »

  1.   

    临时用,随用随删除,这样也不占资源。这种方式一般用在查询表获取一个值如果是获取数据集,那么可以把查询的数据集放在STRINGGRID或LISTVIEW中呈现。如果一定要与DATASOURCE一起工作,那么建议在表单上放一个TADOQUERY控件吧。
      

  2.   

    写成function(ADOCjcx:TADOQuery),把ADOCjcx:TADOQuery当作参数传进去
      

  3.   

    一般都是随用随删
    频繁地随用随删也会造成一些内存碎片,不过程序一般在客户端,也没人讲究这些!
    我一般都是把ADOQUERY池化,用完之后放到资源池中
      

  4.   

    按照面向对象的思想是:把它放到类变量中。例子:TMainForm = class(TForm)
      .
      .
      .
    private
      ADOCjcx:TADOQuery; 
    end;
    procedure TMainForm.Button1Click(Sender: TObject); 
    begin 
      if Assigned(ADOCjcx) then
        FreeAndNil(ADOCjcx);
      ADOCjcx := TADOQuery.Create(Self); 
      ADOCjcx.Connection := myDataMd.ADOConnection1; 
      ADOCjcx.SQL.Add('select * from tbA'); 
      ADOCjcx.Open; 
    end;
      

  5.   

    我一般都是把ADOQUERY池化,用完之后放到资源池中??
    要怎样做呢?
      

  6.   


    ado:= TAdoQuery.Create(nil)
    try
      .....
    finally
      FreeAndNil(Ado);
    end;
      

  7.   

    池化:对象即指针,指针就可以用TList之类的队列保存,需要则取(TList.Items),用完放返回(TList.Add)。程序优化中的一点就是:在Application生存期,尽量一次分配(Create),一次释放(Free)
      

  8.   

    内存泄漏不一定是局部变量ADOCjcx产生的,可能是myDataMd.ADOConnection1产生的
    你可以换成指定connectstring=myDataMd.ADOConnection1.connectstring试试