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();。这就保证了任何类型的对象都可以正确地被析构。
转载于:https://www.cnblogs.com/hssbsw/p/3159706.html
Delphi 对象的创建(create)与释放(free/destory)相关推荐
- C++类对象的创建与释放过程
C++类对象的创建与释放过程 类的定义与实例化 类对象的创建方法 类对象的创建过程 类对象的释放过程 析构函数 缺省析构函数 类的定义与实例化 类对象的创建方法 1.在栈上创建 类名 对象; // 无 ...
- TObject简要说明-对象的创建流程
Delphi:TObject简要说明-对象的创建流程2009-08-14 08:57TObject = class //创建 constructor Create; //释放 procedure Fr ...
- react 调用组件方法_React源码分析1 — 组件和对象的创建(createClass,createElement)...
1 组件的创建 学习了半年前端了,感觉前端的水确实也很深.做安卓的时候就对React-Native比较感兴趣,开发H5时也使用了一段时间的ReactJS.所以决定好好分析下它的源码.文章中有不对的地方 ...
- c++类对象的创建方式
对象创建限制在堆或栈 c++类对象的创建方式 对象创建限制在堆或栈 C++ 中的类的对象的建立模式 如何将类限制在堆上呢? C++ 中的类的对象的建立模式 C++ 中的类的对象的建立模式分为两张:静态 ...
- MFC 教程【5_MFC对象的创建】
MFC对象的创建 前面几章介绍了MFC的核心概念和思想,即介绍了MFC对Windows对象的封装方法和特点:MFC对象的动态创建.序列化:MFC消息映射机制. 现在,考查MFC的应用程序结构体系,即以 ...
- C++笔记 对象的创建与消亡
经过 C++ Primer Plus 上的实验发现:对象操作是一个栈的机制. 先被创建的对象,后被释放,而对一个已经具体化的对象进行的任何改变,都会导致旧对象的消亡. 执行的顺序是先构造,再复制,最后 ...
- 转 cocos2d-x 3.0 常用对象的创建方式
cocos2d-x 3.0 中所有对象几乎都可以用create函数来创建,其他的创建方式也是有create函数衍生. 下面来介绍下create函数创建一般对象的方法,省得开发中经常忘记啥的. 1.精灵 ...
- 041_对象的创建和销毁
1. 对象的创建和销毁都在JavaScript执行过程中发生, 理解这种方式的含义对理解整个语言至关重要. 2. 声明和实例化 2.1. 对象的创建方式是用关键字new后面跟上实例化的类的名字: va ...
- 浅析Java中对象的创建与对象的数据类型转换
这篇文章主要介绍了Java中对象的创建与对象的数据类型转换,是Java入门学习中的基础知识,需要的朋友可以参考下 Java:对象创建和初始化过程 1.Java中的数据类型 Java中有3个数据 ...
最新文章
- R语言dim函数获取dataframe、matrix的维度、shape实战
- ubuntu KDE桌面
- libxml2_ZC积累
- HttpDNS功能说明及实现
- python网格搜索核函数_(转载)Python机器学习笔记GridSearchCV(网格搜索)
- 廖雪峰JS教程学习记录----Map和Set
- 笔记本外接显示器设置全屏壁纸
- eclipse查看源码
- Windows Server 2003安装应用程序时,提示缺失kernel.dll文件
- 易筋SpringBoot 2.1 | 第三十五篇:实战Aparche Maven 的核心概念与理论 Maven仓库管理 从入门到精通
- ArcGIS图解建模工具与DEM提取山脊、山谷线(水文分析、表面分析)
- Brother DCP-1608 Printer共享打印机防坑指南
- 报 刊 集 锦(转载)
- off cpu linux,宋宝华: 用off-cpu火焰图进行Linux性能分析
- Python 监控linux之dstat
- python黑白方格画
- 七牛云和Github如何使用PicGo设置免费图床
- vos3000外呼系统讯时O口网关加密注册 VOS 配置方法
- 安卓中的hander
- zz纯数学课程科目与教材推荐