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


    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中继承过来的。把您的注销放在try…finally程序模块的finally部分,
    而把对象的程序代码放在try部分是编程的好习惯。这样,即使您的程序代码在使用对象时发生了异常事件,
    也会确保您为这个对象分配的内存会被释放。

    二者的区别是,Destroy 会直接释放对象,
    而Free会事实检查该对象是否存在,如果对象存在,或者对象不为nil,它才会调用Destroy。
    因此,程序中应该尽量使用free来释放对象,这样更加安全一些。
    (但要注意,free 也不会自动将对象置为nil,所以在调用free之后,最好是再手动将对象置为nil。)
    TObject类有一个虚拟的Destroy虚构函数和一个非虚拟的Free函数。Free函数中是调用Destroy的。
    因此,当我们对任何对象(都是TObject的子类对象)调用.Free();之后,都会执行TObject.Free();
    它会调用我们所使用的对象的析构函数Destroy();。这就保证了任何类型的对象都可以正确地被析构。

  • 相关阅读:
    拦截导弹类问题 (Codevs4888零件分组POJ1065Wooden Sticks)(LIS及其覆盖问题)
    BZOJ1034[ZJOI2008]泡泡堂
    BZOJ1015[JSOI2008]星球大战starwar题解报告
    合唱队形(DP)
    美元和马克(dp)
    链式前向星
    hdu-6170(模拟)
    51nod-1117 聪明的木匠(优先队列)
    51nod-1095 Anigram单词(简单map)
    KingXMagicSpells 期望dp (记忆化搜索)
  • 原文地址:https://www.cnblogs.com/hssbsw/p/3159706.html
Copyright © 2020-2023  润新知