"可能的问题1:我在每次记录前都要到几个子表(使用了ADOTable)中Locate我需要的数据,得到后赋值给前面的参数后,立即Close掉ADOTable"最好不要使用ADOTable的locate来查找数据,因为locate查找数据是把整个表读取到客户端后进行查找的,效很低,并且对于查找大数据量的表时很有可能会出现内存遗漏。最好用ADOQuery或ADODataSet用SQL来查找并取得数据集。对于可能的问题2:你可以动态生成ADOQuery,生成时不要指定父对象,用完后自己释放,否则如果Child没释放,这个ADOQuery应该不会自己释放的,如:var ADOQuery1;
//.......begin
ADOQuery1 := TADOQuery.Create(nil); //........ ADOQuery1.Close();
ADOQuery1.Free;
end;
//.......begin
ADOQuery1 := TADOQuery.Create(nil); //........ ADOQuery1.Close();
ADOQuery1.Free;
end;
导致20或30次之后就有了很多的此child,也有了很多的adoquery
所以资源也~~~~~~~~~~~~~~~~~~~~~~~~解决方法:调用child时
if not assign(child) then //如果没有child的实例才进行
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
另外,Child中的ADOQuery我一直在使用,没有必要在使用时Free掉,而Child在caFree的时候,自然就Close掉了,这不太可能是内存泄漏的问题吧?
先给点分数。
还有我使用的是Windows98系统,就算要占用30-40M内存,但也不应该内存耗尽,客户端都是128M内存。
对了,我过去用BDE的时候,同样操作就没有问题。换ADO后程序就不断吃内存了。
执行完尽量关闭ADOQuery
谁还能给分析一下?程序里面实在找不出错误了。 :(
还有,我已经放弃用locate了,但内存还在减少。
他可以帮你检查Delphi程序的内存分配情况~~
安装后会在Delphi里面增加一个菜单~~
然后运行你的程序~跟踪看看~~
一定是你的其他地方有问题。
建议你用替换法,替换成其他操作试一试,把问题一点一点的简化,看是不是ADOTable在释放时出现的问题,或者其他子表问题。先准确的找到问题的结症所在。
建议使用ADOQuery。