请大家看一下这里为什么会产生内存泄露(20分)

  • 主题发起人 主题发起人 batconv
  • 开始时间 开始时间
B

batconv

Unregistered / Unconfirmed
GUEST, unregistred user!
在保存文件夹内放一个access数据库,新建一个项目,在一个窗体上放一个按钮并粘贴以下代码:

procedure TForm1.Button1Click(Sender: TObject);
var
sFile:string;
ADOQuery:TADOQuery;
begin
sFile:=ExtractFilePath(ParamStr(0))+'Data.mdb';
if FileExists(sFile) then
begin
ADOQuery:=TADOQuery.Create(self);
ADOQuery.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+sFile +';'+'Persist Security Info=False';
ADOQuery.free; //释放生成的控件
end;
end;
编译运行!此时这个程序占用内存为4M,如果你点击Button1,你会发现占用内存会上升到5M,代码很清楚我已经释放了这个生成的控件,为什么还会有这1M的内存占用,是哪里泄露了,还盼高手指点,并提出解决办法,谢谢!!
 
FreeAndNil(ADOQuery);
 
内存泄露不是用这种方法来查的.

用 MemProof 就可以真实的看出来了.
 
QSmile,那为什么在任务管理器的内存占用上会变大呢?
 
memproof的版本好老了,不知道谁有比较新的!楼主,你说的未必是内存泄漏,你多按几次button看看,如果出错了,那就泄漏了阿哦!
 
内存泄露不是用这种方法来查的. 严重同意

至于你看到的内存增加,应该只是操纵系统或编译器暂时仍将已经释放的页面文件仍缓记在这个进程里,不过这跟内存泄漏没关系,内存泄漏是指这块内存永久无法使用,或者进程存活期内不停申请无法再利用的内存。
 
ADOQuery 这个本身是从微软的一组ActiveX控件2次封装出来的
所以 这些控件内部的一些资源释放 单就楼主的方式是不可证明的
 
谢谢大家关注,看来是我对内存泄露的定义没搞清楚,那先暂且不管这个概念,按照我的代码是否已经正确的释放了新控件占用的内存?按照shangshang的观点,是否是说这显示占用的现象只是暂时的,并不是真的在占用内存,会随时间流逝自动释放出来,那这种现象会否影响机器运行呢?有什么解决的办法,欢迎大家把解决问题的代码贴出来。
 
看内存泄漏是用 cnmemprof.pas之类的单元检测, 你不是检测方法。
 
我发现一个好东东. 下一个 FastMM4 ,替换 Delphi 原来的 borlndmm.dll

在IDE 中,如果有内存泄露,在退出程序时,它会给你提示的.

还有听说 FastMM 会让Delphi 程序运行更快.一举两得.
 
多人接受答案了。
 
后退
顶部