可不可以为局部变量分配堆内存?该如何处理

可不可以为局部变量分配堆内存?
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;

------解决方案--------------------
临时用,随用随删除,这样也不占资源。这种方式一般用在查询表获取一个值

如果是获取数据集,那么可以把查询的数据集放在STRINGGRID或LISTVIEW中呈现。

如果一定要与DATASOURCE一起工作,那么建议在表单上放一个TADOQUERY控件吧。
------解决方案--------------------
写成function(ADOCjcx:TADOQuery),把ADOCjcx:TADOQuery当作参数传进去
------解决方案--------------------
一般都是随用随删
频繁地随用随删也会造成一些内存碎片,不过程序一般在客户端,也没人讲究这些!
我一般都是把ADOQUERY池化,用完之后放到资源池中
------解决方案--------------------
按照面向对象的思想是:把它放到类变量中。例子:
Delphi(Pascal) code

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;

------解决方案--------------------
Delphi(Pascal) code

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

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