荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: georgehill (佐治·希尔【多情网虫无情网】), 信区: Program
标  题: Delphi中对象解除技巧
发信站: BBS 荔园晨风站 (Sun Mar 12 01:33:03 2000), 转信

资料整理·中国程序员网站


Delphi中对象解除技巧

郑州 邹国栋

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

                -- Bye 赤明莉香 --
 我是来自大富翁的小美!^_^

※ 来源:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.115]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店