程序关闭时的资源释放问题(15分)

V

victor

Unregistered / Unconfirmed
GUEST, unregistred user!
我作了个较大的程序,程序中form比较多,
现在有个这样的问题,程序正常启动和退出都没
问题,但程序在运行若干次后(就是正常退出后在启动),
再次运行就会报系统资源不够,然后就不能运行。
只有退出95后,再启动操作系统,又运行正常,
但多次重复启动,关闭,又会出现同样的现象。

我听说delphi在释放系统资源上(就是程序退出时)作得
不是很好?有这事吗?我的程序应如何改进?

谢谢!
(我已是倾囊而出了,虽然只有15分 :) )
 
你的Form最好都改成动态建立和Free。试试下面的代码:

这是一个Form的说明:
TMyForm=class(TForm)
...
end;

调用:
procedure CallForm;
begin
With TMyForm.Create do begin
<在这里添加你的窗口调用代码>
Free;
end;
end;

可能对一些复杂的窗口操作无法实现。
 
我对form的调用几乎都是这么作的,除了
放置报表的form

var tempform:Tform;
begin
tempform:= MyForm.create(self)
tempform.showmodal
tempform.free
end

但结果还是那样,而且我在运行程序的时候监测了一下
系统资源使用情况,发现有时在free之后,资源是释放了,
但有时没有。而且的确每次程序运行正常结束后,系统资源是
少了一下。这样累积就导致程序无法运行了。
 
我对form的调用几乎都是这么作的,除了
放置报表的form

var tempform:Tform;
begin
tempform:= MyForm.create(self)
tempform.showmodal
tempform.free
end

但结果还是那样,而且我在运行程序的时候监测了一下
系统资源使用情况,发现有时在free之后,资源是释放了,
但有时没有。而且的确每次程序运行正常结束后,系统资源是
少了一下。这样累积就导致程序无法运行了。
 
除了Form之外,有没有其他的对象呢?我是说不是从TComponent继承下来的对象,
那需要自己负责释放内存的。
 
内存泄露Memory Leak肯定是有指针或对象没有Free,

资源不足多半因为有BMP对象没free

即使是Borland的源代码,都犯有这样的错误!!!,何况我辈?
(详情可以去看Delphi的Bug List)

最好用PView,MS VC提供的工具查看一下?

另外delphi informant有一篇文章(pdf)专门谈到这个问题,
并提供一个检查资源内存的单元,如有需要我可以e-mail
给你或提供给大家!
 
jiangtao:
OK, please e-mail that pdf file to me,
my e-mail: yjzhang@nudt.edu.cn

yes, 我的程序中有不少image控件,
在屏幕上显示了不少的bmp图片。
但bmp放到form上后,应算form中的一个构件了,
释放form后,它们也应该被释放了,否则要将bmp一个一个的
释放,企不是很麻烦。
 
TImage构件是有Owner的,而TBitmap类是没有的,‘
如果老兄自己创建了TBitmap变量,必须自己释放。
Delphi自己的VCL中的Memory Leak一般影响不大。
你可以在iNet上找一些检查Memory Leak的程序
试试,我记得www.turbopower.com
有一个,30天试用版。
 
推荐大家一个软件Memproof,其站点为http://www.nidlink.com/~astoyanov/
该站点上有关于Delphi各个版本(3.02,4.0等)的Memory leaks,及其修正方法。
很不错的。来不及帮您分析了,自个儿上去看吧。这个软件也是Free的。
 
Delphi老兄说的对,自己创建的TBitmap必须自己释放掉。
可以在创建时把bitmap加入到一个TList中去。需要释放的时候,只需要检查
TList中是否有元素,有则逐个释放之。注意TList.Free的时候,不会自动
释放掉List中的对象的。
 
hi,
他们的回答都有道理,关键是
如果是你自己分配的Bmp,和指针(Pointer or TList),你必须自己释放
而且TList不能简单的调用TList.Free;
而是要先循环释放每个Item,请查收mail
 
有道理,推荐使用
try
xxx := xxx.create;
finally
xxx.free
end;
如果你的程序有异常也可以释放内存
 
我在每个窗体中凡是动态建立的控件在Form退出之前,我调用了如下语句:
(当然我自己是知道建立了那些动态控件的)

if assigned( Control_X) then Control_X.Free
.
.
.

不知这样是否对你有帮助 :)
 
我认为,CJ的方法追简单实用.
 
不对吧?
TControl.Free仅仅释放实力, 并不把指真设位 nil
assigned(Control) 仍然有效.
 
你要是用的D版的,那你是没办法了,因为Delphi的D版不释放资源。
这是Delphi的加密方法。
 
瞎说. 我用D版的. 但是我的DELPHI好象释放起来特别起劲. 原来我还以为
TTreeNode里的Data需要自己释放呢, 想不到delphi自己做掉了. 害得我的程序
老出错, 至少找了两天原因.
 
可以使用BoundsChecker,这是NuMega公司的产品,有标准版,vc版以及Delphi版,我用过它的VC版,曾经监测出许多泄漏的代码,非常好,可以到WWW.NUMEGA.COM去download,30day试用。
 
delphi本身运行一段时间后就有可能有一部分内存没释放,也许你的程序并没有此问题,请脱离delphi环境试运行,并且用内存资源观察器确认是否资源在不断减少.
 
也许是因为我自己释放所有的控件的原因吧(我编的程序是在一个空form 上动态建立
各种控件的, 为了保险, 退出时所有控件的释放都是我自己来做的)
其实我想design生成的form也能用这方法吧
只要在Onclose事件中加上
while form1.componentcount>0 do
components[0].Free;
就行了
 
顶部