网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Delphi
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.Delphi中使用动态SQL的几个问题.
.通用查询组件设计.
.可以左右居中对齐并可设置Displa.
.用Delphi创建服务程序.
.Delphi2005(DiamondBack)使用体验.
.黑白图像的缩小灰度级显示算法的.
.老友归来--delphi2005试用手记1.
.Delphi制作带图标的弹出式选单.
.有的程序不能运行于win98的原因.
.在DELPHI2.0/3.0中直接操作端口.
.[Delphi]一个解析FTP地址的小函数.
.QQ窗体自动隐藏效果探究.
.组件制作之四(定制外观).
.如何接受消息,中断正在处理的过.
.Delphi托盘编程实战演练.
.关于WEB应用程序的打印组件开发初.
.在Delphi中实现StringTokenizer功.
.Delphi的拨号连接类.
.合理应用用户登录界面,用户登录.
.如何获取本地HTML文件的标题,超级.

Delphi中对象解除技巧

发表日期:2006-2-4


我的主页: http://www.tommstudio.com/

在Delphi程序设计中,我们需要通过解除建立的所有对象来避免内存泄漏。但是,如果你在程序中不谨慎小心的话,很容易多次解除同一个对象,这将会引起很严重的错误,造成应用程序崩溃,甚至是死机。

请看下面的程序:


procedure TForm1.Button1Click(Sender:TObject);
var
 Button2,Button3:TButton;
begin
   Button2:=TButton.Create(self);
   Button3:=TButton.Create(Button2);
   Button2.Free;
   Button3.Free;
end;


  在上例中,当执行到Button3.Free时会产生一个错误,因为在调用Button2.Free时,Button2被解除,但因为Button2是Button3的宿主,Button3也同时被解除,因此错误就不可避免地发生了。
  要避免上述错误,有两种方法:第一,在解除宿主之前要先解除其所属的所有组件。这种方法很简单,只要将上例中Button2.Free和Button3.Free换位即可。第二,在Button3.Free执行之前将Button3变量设置为nil。程序如下:


Button2.Free;
Button3:=nil;
Button3.Free;


  在上面的程序中,将Button3置为nil是为了阻止应用程序重新使用已解除对象的内存。在调用Free对象方法时,它会确定对象是否为nil,如果不是,Free对象方法会假定对象仍然存在,使用对象引用为它分配内存,然后调用Destroy释放对象内存,并清除任何相关的虚拟对象方法的数据表格信息。而Destroy对于有对象存在的内存地址不会做任何改变,所以如果在调用Destroy之后测试该内存地址,它仍可能有效。所以当在程序中两次调用一个对象而没有将对象引用置为nil时,对象引用将仍然引用对象解除之前所占用的内存地址,这就是产生错误的原因。
  当然,在实际开发过程中,大多数错误不会这样明显,解决的方法也要依具体而定,不会这么简单地加一句话就能解决问题。我在这里只是说明一种编程思想,起一个抛砖引玉的作用,具体的东西还要靠你在实践中去探索,积累。

上一篇:一个多线程后台扫描的程序和源代码 人气:5172
下一篇:获得Windows的版本信息 人气:4583
浏览全部Delphi的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐