Delphi中对象解除技巧

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 srw 的 blog

我的主页: 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时,对象引用将仍然引用对象解除之前所占用的内存地址,这就是产生错误的原因。
  当然,在实际开发过程中,大多数错误不会这样明显,解决的方法也要依具体而定,不会这么简单地加一句话就能解决问题。我在这里只是说明一种编程思想,起一个抛砖引玉的作用,具体的东西还要靠你在实践中去探索,积累。

本文关键:Delphi中对象解除技巧
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top