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,否则就会有Memory   Leak。
但是如果形如x   :=   TX.Create(Application)这样,可以不Free,那么在Application被Free时,Application会替你free的


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();。这就保证了任何类型的对象都可以正确地被析构。

posted @ 2020-05-20 16:44  huiy_小溪  阅读(428)  评论(0编辑  收藏  举报