"可能的问题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;

解决方案 »

  1.   

    我觉得是因为child没有释放掉,每次使用该child都新建了一个
    导致20或30次之后就有了很多的此child,也有了很多的adoquery
    所以资源也~~~~~~~~~~~~~~~~~~~~~~~~解决方法:调用child时
    if not assign(child) then  //如果没有child的实例才进行
      xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      

  2.   

    我几个ADOTable中数据不超过10条。
    另外,Child中的ADOQuery我一直在使用,没有必要在使用时Free掉,而Child在caFree的时候,自然就Close掉了,这不太可能是内存泄漏的问题吧?
    先给点分数。
      

  3.   

    内存泄露可能只是个假象我用ADO组件写的服务程序,同时成百上千的线程登录上来进行ADO组件的读写查询操作。刚开始的线程内存也是一直往上加的,据我观察,程序的内存使用会一直涨到30-40M后不动了,这可能是win2k的内存管理机制
      

  4.   

    我还要补充一下,录入Child一般不反复关闭或打开,即使录入20-30条记录也只Open一次Child。
    还有我使用的是Windows98系统,就算要占用30-40M内存,但也不应该内存耗尽,客户端都是128M内存。
      

  5.   

    这方面我以前遇到过,你应该把adoquery1放在datamodal1中,然后写个相关函数供child调用,locate是把数据库中所有数据下载到client然后再查,你反复执行locate就是反复把数据库中所有数据下载到client,当然会占用内存,我现在出差,手头没有delphi+sqlserver,等我回到单位肯定为你解决。建议你先看看c:/programs files/delphi5/demo/db/masterapp的datamodal的table,qurery,相关before***,after****是怎么写的,然后把你的问题详细说明一下。肯定为你解决!!!
      

  6.   

    非常感谢,我先试试。如果问题解决,回答问题的朋友每人都有分。 :)
    对了,我过去用BDE的时候,同样操作就没有问题。换ADO后程序就不断吃内存了。
      

  7.   

    停止使用locate~~
    执行完尽量关闭ADOQuery
      

  8.   

    我把所有的ADOTable都换为SQL查询后,并没有解决内存泄漏问题。另外,Child窗体在录入的过程中从不关闭,录入10几条记录后,内存几乎耗光了。
    谁还能给分析一下?程序里面实在找不出错误了。 :(
      

  9.   

    那最大的可能性就是locate了,每次都会下载数据到内存,估计是它
      

  10.   

    请教一下,检查内存的方法。我有memproof,但有些看不明白。而且报告出来后,并没有error,主要是动态指针和虚拟内存使用量比较大,剩下的看不明白了。 :(
    还有,我已经放弃用locate了,但内存还在减少。
      

  11.   

    建议安装Bounds Checker ,
    他可以帮你检查Delphi程序的内存分配情况~~
    安装后会在Delphi里面增加一个菜单~~
    然后运行你的程序~跟踪看看~~
      

  12.   

    我用bounds Checker跟了一下,可Memory Leak基本都是System.pas、Controls.pas和Graphics.pas,唯一的Error在整个程序退出的时候Form.pas有个无效声明。请大家帮忙看看吧,指点一下该如何分析出我程序中内存泄漏的原因。
      

  13.   

    使用ADO是不会有内存泄露的,我用了很多,没有问题.
    一定是你的其他地方有问题。
      

  14.   

    别往太深的地方考虑,ADO不会出现这么多这个问题的
      

  15.   

    ADO支持多表JOIN的数据更新。处理机制与BDE不一样,你其实如果只是INSERT时保存明细表的记录,没有必要使用LOCATE。直接保存就行。
      

  16.   


    建议你用替换法,替换成其他操作试一试,把问题一点一点的简化,看是不是ADOTable在释放时出现的问题,或者其他子表问题。先准确的找到问题的结症所在。
      

  17.   

    每个程序所占用内存肯定有限制,不可能无限使用。
    建议使用ADOQuery。