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

  • 相关阅读:
    2014年7月 记事
    从客户端中检测到有潜在危险的Request.Form值 的解决方法
    jquery parent() parents() closest()区别
    不包含适合于入口点的静态"Main"方法
    JQuery移除事件
    jQ的toggle()方法示例
    codeforces hello2018 D Too Easy Problems
    HDU-6084 寻找母串
    51Nod 1109 01组成N的倍数
    可重排列
  • 原文地址:https://www.cnblogs.com/huiy/p/12924514.html
Copyright © 2011-2022 走看看