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

转载于:https://www.cnblogs.com/hssbsw/p/3159706.html

Delphi 对象的创建(create)与释放(free/destory)相关推荐

  1. C++类对象的创建与释放过程

    C++类对象的创建与释放过程 类的定义与实例化 类对象的创建方法 类对象的创建过程 类对象的释放过程 析构函数 缺省析构函数 类的定义与实例化 类对象的创建方法 1.在栈上创建 类名 对象; // 无 ...

  2. TObject简要说明-对象的创建流程

    Delphi:TObject简要说明-对象的创建流程2009-08-14 08:57TObject = class //创建 constructor Create; //释放 procedure Fr ...

  3. react 调用组件方法_React源码分析1 — 组件和对象的创建(createClass,createElement)...

    1 组件的创建 学习了半年前端了,感觉前端的水确实也很深.做安卓的时候就对React-Native比较感兴趣,开发H5时也使用了一段时间的ReactJS.所以决定好好分析下它的源码.文章中有不对的地方 ...

  4. c++类对象的创建方式

    对象创建限制在堆或栈 c++类对象的创建方式 对象创建限制在堆或栈 C++ 中的类的对象的建立模式 如何将类限制在堆上呢? C++ 中的类的对象的建立模式 C++ 中的类的对象的建立模式分为两张:静态 ...

  5. MFC 教程【5_MFC对象的创建】

    MFC对象的创建 前面几章介绍了MFC的核心概念和思想,即介绍了MFC对Windows对象的封装方法和特点:MFC对象的动态创建.序列化:MFC消息映射机制. 现在,考查MFC的应用程序结构体系,即以 ...

  6. C++笔记 对象的创建与消亡

    经过 C++ Primer Plus 上的实验发现:对象操作是一个栈的机制. 先被创建的对象,后被释放,而对一个已经具体化的对象进行的任何改变,都会导致旧对象的消亡. 执行的顺序是先构造,再复制,最后 ...

  7. 转 cocos2d-x 3.0 常用对象的创建方式

    cocos2d-x 3.0 中所有对象几乎都可以用create函数来创建,其他的创建方式也是有create函数衍生. 下面来介绍下create函数创建一般对象的方法,省得开发中经常忘记啥的. 1.精灵 ...

  8. 041_对象的创建和销毁

    1. 对象的创建和销毁都在JavaScript执行过程中发生, 理解这种方式的含义对理解整个语言至关重要. 2. 声明和实例化 2.1. 对象的创建方式是用关键字new后面跟上实例化的类的名字: va ...

  9. 浅析Java中对象的创建与对象的数据类型转换

    这篇文章主要介绍了Java中对象的创建与对象的数据类型转换,是Java入门学习中的基础知识,需要的朋友可以参考下 Java:对象创建和初始化过程 1.Java中的数据类型     Java中有3个数据 ...

最新文章

  1. R语言dim函数获取dataframe、matrix的维度、shape实战
  2. ubuntu KDE桌面
  3. libxml2_ZC积累
  4. HttpDNS功能说明及实现
  5. python网格搜索核函数_(转载)Python机器学习笔记GridSearchCV(网格搜索)
  6. 廖雪峰JS教程学习记录----Map和Set
  7. 笔记本外接显示器设置全屏壁纸
  8. eclipse查看源码
  9. Windows Server 2003安装应用程序时,提示缺失kernel.dll文件
  10. 易筋SpringBoot 2.1 | 第三十五篇:实战Aparche Maven 的核心概念与理论 Maven仓库管理 从入门到精通
  11. ArcGIS图解建模工具与DEM提取山脊、山谷线(水文分析、表面分析)
  12. Brother DCP-1608 Printer共享打印机防坑指南
  13. 报 刊 集 锦(转载)
  14. off cpu linux,宋宝华: 用off-cpu火焰图进行Linux性能分析
  15. Python 监控linux之dstat
  16. python黑白方格画
  17. 七牛云和Github如何使用PicGo设置免费图床
  18. vos3000外呼系统讯时O口网关加密注册 VOS 配置方法
  19. 安卓中的hander
  20. zz纯数学课程科目与教材推荐

热门文章

  1. Docker: Jenkins里的pipeline编写基本技巧
  2. Ubuntu 无法应用原保存的显示器配置
  3. HDU 4487 Maximum Random Walk
  4. 11.SolrJ索引操作
  5. 牛客网未通过代码---
  6. Atitit.java swing打印功能 api  attilax总结
  7. (原创)c#学习笔记06--函数02--变量的作用域01--其他结构中变量的作用域
  8. C#获取txt记事本内容,防止乱码情况
  9. 每次新建Android项目都报样式找不到的错误?
  10. 用excel打开文本内容