本人长期使用delphi,现用delphi开发了一个服务程序(使用了ADO),该程序长期在后台运行,需要经常动态创建很多对象,
用完后就释放它们,但是发现时间一长(2天),该程序占用的内存有几百兆(300M),可能是有内存泄漏(win2000 advance server),
但是我把程序移到win2000 advance server sp2,发现程序占用的内存一直在11M左右,不会增长,这令我百思不得其解。
如果Delphi好像java那样有垃圾回收机制多好,程序员可以专心的把时间放在业务逻辑上面,根本不需要考虑内存的泄漏,对象的释放问题。
以下是一个例子:
procedure TForm1.Button1Click(Sender: TObject);
var
edit:TEdit;
kk: TstringList;
a: boolean;
begin
edit:= TEdit.Create(nil);
kk := TstringList.Create;
//edit.Free;
//kk.Free;
end;
用一个timer每个100ms执行一次
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Button1Click(nil);
end;
结果,程序所占的内存越来越多,把注释去掉,所占内存不会增长,这是一个明显的例子。
我使用了Boundschecker,memproof来检测漏洞,效果不理想:上面的问题没有检出来,
Boundschecker花很多时间检测系统的单元,核心单元检测不到什么问题,memproof好像没能像它所说的那样跟踪到泄漏代码的那行等等;
如果不能有效的检测并解决内存泄漏问题,那么所开发出来的长时间运行的Delphi程序都存在一个很大的隐患。这是一个很大的问题。
现请教各位高手有什么方法可以有效的解决这个问题,我用的是D6,不知是否我用的Boundschecker,memproof版本不对,请问这两个软件有for D6的吗?有的话请说明一下怎么使用,不胜感激!另外像java的垃圾回收这样好的机制,delphi应该有必要“升级”一下吧,如下一个例子delphi处理机制:
try
对象1.create;
对象2.create;
except
on 异常1 do
begin
发生异常的业务处理1;
对象1.free;
end;
on
on 异常2 do
begin
发生异常的业务处理2;
对象2.free;
end;
end; java处理机制:
try{
new 对象1;
new 对象2;
}
catch
异常1{
发生异常的业务处理1;
}
异常2{
发生异常的业务处理2;
}
java处理让我们可以只专注于业务处理就行,但是delphi却要关心非业务方面的对象的释放问题,而且有时对象之间的释放有很大的互斥关系
如对象1未释放,就不能释放对象2等等诸如此类的问题,请各位讨论一下,帮忙up!
用完后就释放它们,但是发现时间一长(2天),该程序占用的内存有几百兆(300M),可能是有内存泄漏(win2000 advance server),
但是我把程序移到win2000 advance server sp2,发现程序占用的内存一直在11M左右,不会增长,这令我百思不得其解。
如果Delphi好像java那样有垃圾回收机制多好,程序员可以专心的把时间放在业务逻辑上面,根本不需要考虑内存的泄漏,对象的释放问题。
以下是一个例子:
procedure TForm1.Button1Click(Sender: TObject);
var
edit:TEdit;
kk: TstringList;
a: boolean;
begin
edit:= TEdit.Create(nil);
kk := TstringList.Create;
//edit.Free;
//kk.Free;
end;
用一个timer每个100ms执行一次
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Button1Click(nil);
end;
结果,程序所占的内存越来越多,把注释去掉,所占内存不会增长,这是一个明显的例子。
我使用了Boundschecker,memproof来检测漏洞,效果不理想:上面的问题没有检出来,
Boundschecker花很多时间检测系统的单元,核心单元检测不到什么问题,memproof好像没能像它所说的那样跟踪到泄漏代码的那行等等;
如果不能有效的检测并解决内存泄漏问题,那么所开发出来的长时间运行的Delphi程序都存在一个很大的隐患。这是一个很大的问题。
现请教各位高手有什么方法可以有效的解决这个问题,我用的是D6,不知是否我用的Boundschecker,memproof版本不对,请问这两个软件有for D6的吗?有的话请说明一下怎么使用,不胜感激!另外像java的垃圾回收这样好的机制,delphi应该有必要“升级”一下吧,如下一个例子delphi处理机制:
try
对象1.create;
对象2.create;
except
on 异常1 do
begin
发生异常的业务处理1;
对象1.free;
end;
on
on 异常2 do
begin
发生异常的业务处理2;
对象2.free;
end;
end; java处理机制:
try{
new 对象1;
new 对象2;
}
catch
异常1{
发生异常的业务处理1;
}
异常2{
发生异常的业务处理2;
}
java处理让我们可以只专注于业务处理就行,但是delphi却要关心非业务方面的对象的释放问题,而且有时对象之间的释放有很大的互斥关系
如对象1未释放,就不能释放对象2等等诸如此类的问题,请各位讨论一下,帮忙up!
解决方案 »
- 请问这到底是个什么错误
- 各位老大,谁肯指教一下呢!如果点鼠标同时选中多个文件时,该用什么函数把全部文件调入程序呢?
- 用DELPHI修改系统时间?很急
- 80分求MSCOMM控件进行条码输入的方法,最好是有例程!
- 关于日期问题?
- 如何在已打开的当前excel文件中插入一行记录,excel文件是新建的事先不知道文件名。(excel是在程序里打开的)
- 动态创建控件时出错,有代码
- 如何利用oracle的数据字典,查询某用户创建的全部表,但是不需要系统创建的表
- 谁用过libusb啊。。。啊、、、
- 存储过程的param属性里总有一个 @return_value ,这是什么,有什么用?
- 各位:哪有象qq界面的那种控件可以免费使用?
- Indy9.0中TIDFtpServer的初始目录怎么设定?请问诸友。
procedure TForm1.Button2Click(Sender: TObject);
var
F: file;
Size: Integer;
Buffer: PChar;
begin
AssignFile(F, 'c:\logfile.txt');
Reset(F, 1);
try
Size := FileSize(F);
GetMem(Buffer, Size);
try
finally
//FreeMem(Buffer, Size);
end;
finally
CloseFile(F);
end;
end;把FreeMem(Buffer, Size);注释掉,每按一次,程序所占内存资源就增加,但是boundchecker却没能检测出来,这是什么回事,另外,对象调用构造函数动态的创建,没有释放是属于resource leak
这东西的确很烦,我觉得一个好的代码书写习惯会避免很多这类的错误。
Try
Finally
Free;
end;我想时可以避免的,我想只要在主线程结束前所有创建的对象被释放,应该不会有内存泄漏了吧,像ly_liuyang(Liu Yang) 说的。像pazee(耙子)说的,养成良好的程序代码书写习惯,用那些安全的格式写代码,应该会降低内存泄漏的几率。初学,望大家指正。
有for d6版下载
内存变量按大类来分,主要可以分3类:1)全局(静态)变量。这个就不要我说了吧?
2)自动变量,也就是常说的局部变量,这类变量离开作用域就自动释放。所以象楼上有人问,STRING怎么释放,一般来说,离开了它的作用域,就会自动释放的,不需要你手工去释放。
3)自由变量。这类变量最麻烦,必须手工申请内存,也必须手工释放。这类变量有自己的作用域,但是生命周期却又是全局的。比如在DELPHI的一个CLASS,即使你是局部变量,超出了作用域,它仍然会存在。这里就是内存泄露最常发生的地方。特别的,如果你使用的是堆,用new创建出来的对象,也都是必须手工释放的。
最安全的释放,一般就是:
1)调用释放函数
2)把原来的变量指向一个空(nil)
for (int i=1;i<100; i++)
{
Object o=new Object();
v.add(o);
o=null;
}
//此时,所有的Object对象都没有被释放,因为变量v引用这些对象。
最后说明:
不要寄希望于任何工具,希望它们来管理内存。管理内存是程序员应该做的事情。否则,就不是个合格的程序员。OK?
考!这里的人,水平都那么烂!
你是一知全解的话,为什么不回答问题?看你上面说的,和没说一样。废话一堆。