转:Delphi中destroy,free,freeAndNil,release用法和区别

1)destroy:虚方法

转:Delphi中destroy,free,freeAndNil,release用法和区别
释放内存,在Tobject中声明为virtual,通常是在其子类中override它,且要加上inherited关键字,才能保证派生类对象正确地被销毁;
但destroy一般不能直接用,为什么?
当一个对象为nil,我们仍然调用destroy,会产生错误。因为destroy是虚方法,它要根据对象中的头四个字节找到虚拟方法表Vmt的入口地址,从而找到destroy的入口地址,所以此时对象一定要存在。但free就是静态方法,它根据对象引用/指针的类型来确定,即使对象本身不存在也不会产生异常,而且在free中有判断对象是否存在的操作,所以一般的情况下都用Free来释放对象。

2)free:静态方法

测试对象是否为nil, 不为nil则调用destroy。下面是free的Delphi代码:
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
一静一动,取长补短,岂不妙哉!
但是调用对象的Destroy只是把对象销毁了,但并没有把对象的引用设为nil,这需要程序员来完成,不过自从Delphi5之后,在sysUtils单元中提供了一个freeAndNil。

3)freeAndNil:一个独立的函数,不属于任何对象,非对象方法,非类方法。

procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;

建议大家用它代替free/Destroy,以便确保正确地释放对象。

4)release:TcustomForm中定义的静态方法。

当窗口中所有的事件处理完之后,才调用free函数。常用在销毁窗口,而在这个窗口中事件处理需要一定的时间的时候,用这个方法能确保窗口事件处理完之后才销毁窗口。
下面是TCustomForm.Release的Delphi源代码:
procedure TCustomForm.Release;
begin
PostMessage(Handle, CM_RELEASE, 0, 0);
//向窗口发CM_RELEASE消息到消息队列,当所有的窗口事件消息处理完之后,
//再调用CM_RELEASE消息处理过程CMRelease
end;
再看看下面CM_RELEASE消息处理过程CMRelease的定义:
procedure CMRelease(var Message: TMessage); messageCM_RELEASE;
procedure TCustomForm.CMRelease;
begin
Free; //最后还是free;
end;

  

爱华网本文地址 » http://www.aihuau.com/a/25101011/64381.html

更多阅读

转载 乌达木的原唱:梦中的额吉

原文地址:乌达木的原唱:梦中的额吉作者:小杰最近在看达人秀,看了乌达木的那段后,总觉得声音有点耳熟,上网查了查,晕...不论网上还是贴吧里,一片乌烟瘴气,谩骂声,争吵,一个个刺眼的标题令人心烦!其实,一直不相信他是假唱,先不说他只是个孩子,唱这首

转载 原创:生命中不能承受之轻——电影《布拉格之恋》随想

原文地址:原创:生命中不能承受之轻——电影《布拉格之恋》随想作者:无聊才读书昨天晚上,在家里又看了一遍电影《布拉格之恋》的完整碟片,感受颇多。这部电影是根据诺贝尔文学奖获得者、捷克著名作家米兰昆德拉的小说《生命不能承受之轻

转:读鲁迅的《风筝》随想与批注

读鲁迅的风筝随想与批注风筝鲁迅课文导语: 在温馨与和美中有亲情,在误解和冲突中也有亲情。本文讲述的就是这样一个故事。北京的冬季,地上还有积雪,灰黑色的秃树枝丫杈于晴朗的天空中,而远处有一二风筝浮动,在我是一种惊异和悲哀。“

转载 美华转:反腐路上不怕鬼 不信邪

原文地址:美华转:反腐路上【不怕鬼】【不信邪】作者:美华博客3_0习访美,在西雅图首站演说就罕见提到「反腐斗争」。还记得3年前中共十八大,习的「就职演说」吗?「打铁还需自身硬」、「物必先腐后虫生」。习不仅将「反腐」放到施政首位,赴美

转载 敬请再转:2014高考作文完整版

原文地址:敬请再转:2014高考作文完整版作者:中国教师梁恕俭2014高考作文·广东卷黑白胶片的时代,照片很少,只记录下人生的几个瞬间,在家人一次次的翻看中,它能唤起许多永不褪色的记忆。但照片渐渐泛黄,日益模糊。数码科技的时代,照片很多,记

声明:《转:Delphi中destroy,free,freeAndNil,release用法和区别》为网友动摇我的世界分享!如侵犯到您的合法权益请联系我们删除