在Delphi程序设计中我们需要通过解除建立的所有对象来避免内存洩漏但是如果你在程序中不谨慎小心的话很容易多次解除同一个对象这将会引起很严重的错误造成应用程序崩溃甚至是死机
请看下面的程序
procedure TForm
Button
Click(Sender:TObject);
var
ButtonButton:TButton;
begin
Button:=TButtonCreate(self);
Button:=TButtonCreate(Button);
ButtonFree;
ButtonFree;
end;
在上例中当执行到ButtonFree时会产生一个错误因为在调用ButtonFree时Button被解除但因为Button是Button的宿主Button也同时被解除因此错误就不可避免地发生了
要避免上述错误有两种方法第一在解除宿主之前要先解除其所属的所有组件这种方法很简单只要将上例中ButtonFree和ButtonFree换位即可第二在ButtonFree执行之前将Button变量设置为nil程序如下
Button
Free;
Button:=nil;
ButtonFree;
在上面的程序中将Button置为nil是为了阻止应用程序重新使用已解除对象的内存在调用Free对象方法时它会确定对象是否为nil如果不是Free对象方法会假定对象仍然存在使用对象引用为它分配内存然后调用Destroy释放对象内存并清除任何相关的虚拟对象方法的数据表格信息而Destroy对于有对象存在的内存地址不会做任何改变所以如果在调用Destroy之后测试该内存地址它仍可能有效所以当在程序中两次调用一个对象而没有将对象引用置为nil时对象引用将仍然引用对象解除之前所占用的内存地址这就是产生错误的原因
当然在实际开发过程中大多数错误不会这样明显解决的方法也要依具体而定不会这么简单地加一句话就能解决问题我在这里只是说明一种编程思想起一个抛砖引玉的作用具体的东西还要靠你在实践中去探索积累