荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店