读书人

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

发布时间: 2012-02-24 16:30:38 作者: rapoo

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

读书人网 >.NET

热点推荐