可不可以为局部变量分配堆内存?该如何处理
可不可以为局部变量分配堆内存?
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池化,用完之后放到资源池中
------解决方案--------------------
按照面向对象的思想是:把它放到类变量中。例子:
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试试