Delphi 对象的创建(create)与释放(free/destory)

create后一定要free吗?

简单举例 
procedure   a; 
var   x:TX; 
begin 
    x:=TX.create; 
    //do   someting; 
    x.free   //如果我这里不free,到了这个end不就是相当于C中的}自动释放吗? 
                      也就是说在此处这个free是多余的。对吗? 
end;

 但是为了可靠性和可读性,这个Free最好不要省。 
而且还要用try...finally...end装起来。 
这样即使你在过程中出现异常,也能保证资源能够释放。

但是为了可靠性和可读性,这个Free最好不要省。 
而且还要用try...finally...end装起来。 
这样即使你在过程中出现异常,也能保证资源能够释放。
但是为了可靠性和可读性,这个Free最好不要省。 
而且还要用try...finally...end装起来。 
这样即使你在过程中出现异常,也能保证资源能够释放。

 向你这样,一定要FREE,否则就会有Memory   Leak。 
但是如果形如x   :=   TX.Create(Application)这样,可以不Free,那么在Application被Free时,Application会替你free的。 
 

Delphi 对象的创建(create)与释放(free/destory) 

  1、Create参数为:nil/self/application的区别,最好能看到实际效果的区别 

  例如: My := TMy.Create(X); 

  其中的 X 将会成为控件 My 的 Owner 属性, 

  可能会不只一个控件把 X 当作 Owner. 

  当 X 释放时, 它会同时释放那些把它当作 Owner 的所有控件. 

  譬如: 

  btn1 := TButton.Create(Panel1); 

  btn2 := TButton.Create(Panel1); 

  btn3 := TButton.Create(Panel1); 

  当 Panel1.Free 时, btn1、btn2、btn3 都会同时释放. 

  如果 btn1 := TButton.Create(Self); {譬如 Self 是窗体} 

  那么窗体释放时, btn1 也会同时释放. 

  btn1 := TButton.Create(Application); 

  当程序销毁时也会同时释放 btn1. 

  这对单窗体程序来讲基本没有区别, 但如果是多窗体就不一样了. 

  如果 btn1 := TButton.Create(nil); 

  那么 btn1 得自己负责手动释放(btn1.Free). 

  你也许会问: 假如 btn1 所在的窗体都销毁了, btn1 还会存在吗? 

  答: 如果 Application 还在 btn1 不会消失(在 Create(nil) 的情况下). 

  一般情况下,当 Application 不在了, 系统会释放它所包含的控件. 

  但等系统来做这件事不是个好习惯, 因为有例外(一般是在跨进程的时候), 有这样一句话: 

  一个对象分配的内存可能会比对象本身存在的时间长. 

  2、Delphi的注销方法有两个:Destroy和Free。 

  Delphi建议使用Free,因为它比Destroy更为安全,同时调用Free会生成效率更高的代码。 

  您可以用下列的语句释放用完的Employee对象: 

  Employee.Free; 

  和Create方法一样,Free方法也是TEmployee从TObject中继承过来的。把您的注销放在tryfinally程序模块的finally部分, 

  而把对象的程序代码放在try部分是编程的好习惯。这样,即使您的程序代码在使用对象时发生了异常事件, 

  也会确保您为这个对象分配的内存会被释放。 

  二者的区别是,Destroy 会直接释放对象, 

  而Free会事实检查该对象是否存在,如果对象存在,或者对象不为nil,它才会调用Destroy。 

  因此,程序中应该尽量使用free来释放对象,这样更加安全一些。 

  (但要注意,free 也不会自动将对象置为nil,所以在调用free之后,最好是再手动将对象置为nil。) 

  TObject类有一个虚拟的Destroy虚构函数和一个非虚拟的Free函数。Free函数中是调用Destroy的。 

  因此,当我们对任何对象(都是TObject的子类对象)调用.Free();之后,都会执行TObject.Free(); 

  它会调用我们所使用的对象的析构函数Destroy();。这就保证了任何类型的对象都可以正确地被析构。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值