当程序结束时,那些资源需要编写代码进行释放(50分)

  • 主题发起人 主题发起人 clion
  • 开始时间 开始时间
一般来说,你在程序中使用Create动态创建的资源需要释放(Free)。
 
不一定吧
如果动态创建的component指定了owner, 在owner释放时会自动释放的
需要程序释放的是那些不是继承自TComponent的, 如TList, TBitmap, ....
 
按照我的理解,指定owner为TComponent对象的可以由owner释放,而对
owner不是TComponent对象的需要程序释放
 
对于new出来的东东也要释放. 比如在TList中或TTreeNode的Data中关联的
指针, 在TList和TTreeView释放时这些指针并没有自动释放.
 
sorry,我这么知道资源是否被释放呢,如有人回答出此问题,我愿再加100分,共150分
给他(她?)*_*.
 
当一个实例由TObject类派生而来时,它的free方法是首先判断
<font color="#ff0000">它的Instance是否为nil</font>,所以,看一个资源是否被释放,就看它的
Instance是否为nil好了!
 
请版主把此题分数改为150分,都给茶叶蛋
 
Tea Agg:不对不对,free之后对象指针之值不确定,不会自动变为nil,除非你在释放
后手工赋值为nil。
 
记得有个工具可以帮助监视资源的释放,具体记不清了
 
BoundsChecker 和 MemProof都可以.
BoundsChecker有很多个版本,for XXX的都有,但要$$
MemProof现在还是免费的,但只针对BCB/Delphi
 
我觉得TreeNode的Data在程序结束时应该可以自己free。
同类的有ListItem的Data。

不知道 Jimchael Tsee 对此有何依据呢?
 
>我觉得TreeNode的Data在程序结束时应该可以自己free。
>同类的有ListItem的Data。
不对, Data不会自动释放,同类的还有TList 和TStringList.Objects
 
Data是不会也不可能被自动释放的,原因有以下几个:

1.Data的类型通常为Pointer类型,而不是TObject,所以可以放置任何类
型的指针数据,指针所指的类型可以不同,大小可以不同,不可能自动释放
(注意它可以不是对象实例,而是new出来的东东)

2.有时(可以说很多时候),Data被这样用
var
i:integer;
……
Data:=Pointer(i);
……
i:=Integer(Data);

如果释放Data,就会天下大乱。

3.Delphi的帮助就是说不会释放的....

4.没啦....
 
VC的话虽然有理,但我用以下实验证明:

有一个我写的程序《批量文件设置器》,里面有TREEVIEW和LISTVIEW各一。
如果装进一个大目录的时候,应该说里面有很多的文件吧?DATA的数量也相当
多了。我每次都是New()一个PString来作为DATA的。而程序结束时我什么也
没有Dispost,就让它结束了。

实验如下,装入程序之前查看系统资源:59%。(已有内存是32MB)
反复装入程序,直达Windows目录,然后关闭程序退出,反复近20次。
再看系统资源,仍然不变,59%。

不知诸位对此有何看法?因为如果按照大家的说法,那么在程序结束之前需要一
个一个的Dispost了它的DATA指向的东西,然后再将它变为NIL吧?太烦了。要不
至少也得来个TreeView1.Items.Clean吧?

请大家斧正。
 
; 你的实验结果非常可信,呵呵....

当Windows应用程序退出时,Windows会自动释放所有分配给它的内存资源,

这是Windows干的事。

如果你的在程序结束时不释放自己申请的资源,Windows也会帮你释放掉的,

但这样做并不是一个好方法:

1.首先这不是一个好的程序风格,所有的资源应该有自己控制,自己申请的就

应该自己释放,同时资源应该在不需要它的第一时间释放掉....

2.不是所有的资源Windows都能释放掉....

3.Windows特别是98并不是一个非常可信的家伙,呵呵....
 
同意 VC,的确应该自己释放内存,就算在NT下,有时也会出问题(少)
 
据我的经验(NT),Win32的资源是可以在程序结束时自动释
放的,如MEM和Thread、Process、File等的句柄.但GDI的
对象就比较麻烦的,必须自己释放,如Bitmap和Pen的句柄.
原因吗,是因为Win32对象是系统内核管理的,每个对象都有
引用计数.而GDI对象是一个Service进程管理的,NT似乎没
有维护其引用计数 :(

在95下,好象很多Win32的资源也不能很好地释放.

但是,释放资源总是必要的.因为不可能知道在整个程序运行中
某个资源分配行为要执行多少次.如果其分配的资源没有释放,
当程序运行时间较长时,就可能发生资源不够的情况,从而需要
程序重新启动.好象"江湖"就因为这个原因被骂得狗血喷头.我
想各位不希望步其后尘吧? :)

所以,在程序发布前用BoundsChecker或MemProof检查一下是
非常必要的.所有需要释放的资源它们都可以监视.而且它们还
可以查出API调用失败而没有进行特殊处理的情况.
 
to tqz:
>Tea Agg:不对不对,free之后对象指针之值不确定,不会自动变为nil,
>除非你在释放后手工赋值为nil。
Use Free to destroy an object. Free automatically calls the Destroy if the
object instance is is <b>not nil</b>. Any object instantiated by a call to Create
should be destroyed by a call to Free, so that the object an be properly
destroyed and the memory released. Free is successful even if the object
<b>is nil</b>, so if the object was never initialized, for example, calling Free
won抰 result in an error.
以上是Delphi帮助的原文.

to lhz:
>但GDI的对象就比较麻烦的,必须自己释放,如Bitmap和Pen的句柄
我记得在Win16程序中还需要自己释放Pen的句柄,
(茶叶蛋有一次没释放,弄出32M内存的机器在Win3.2下报内存不足的笑话)
但是在Win32下好像就可以自动释放了吧?我隐约记得一本夸M$的书上把这一条列为
Win32程序比Win16程序好做的原因耶!

to VC
>如果你的在程序结束时不释放自己申请的资源,Windows也会帮你释放掉的,
有些资源是Delphi帮您释放掉的.详见Delphi帮助
 
后退
顶部