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

Delphi 对象的创建(create)与释放(free/destory)的更多相关文章

  1. 使用Delphi对象(声明、实例化、构造、释放)

    一.声明和实例化 在使用一个对象之前,用class关键字声明一个对象.可以在一个程序或单元的type部分声明一个对象类型: type TFooObject = class; 除了声明一个对象类型,通常 ...

  2. Delphi对象变成Windows控件的前世今生(关键是设置句柄和回调函数)goodx

    ----------------------------------------------------------------------第一步,准备工作:预定义一个全局Win控件变量,以及一个精简 ...

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

    TObject = class    //创建    constructor Create;    //释放    procedure Free;    //初始化实列    class functi ...

  4. java 对象 :创建

    灵感来自effective java 关于对象,是java的核心,如何有效的创建其实是一个值得关注的地方. 1.静态工厂:这是一个值得关注的,并且应该时刻考虑的方法. 优点:1.他是有名字的,这个是如 ...

  5. DELPHI语法基础学习笔记-Windows 句柄、回调函数、函数重载等(Delphi中很少需要直接使用句柄,因为句柄藏在窗体、 位图及其他Delphi 对象的内部)

    函数重载重载的思想很简单:编译器允许你用同一名字定义多个函数或过程,只要它们所带的参数不同.实际上,编译器是通过检测参数来确定需要调用的例程.下面是从VCL 的数学单元(Math Unit)中摘录的一 ...

  6. [ Java学习基础 ] Java对象的创建和销毁

    类实例化可生成对象,实例方法就是对象方法,实例变量就是对象属性.一个对象的生命周期包括三个阶段:创建.使用和销毁. 创建对象 创建对象包括两个步骤:声明和实例化. 声明 声明对象与声明普通变量没有区别 ...

  7. 关于 EF 对象的创建问题

    在开发过程中,项目往往被划分为多层,而一个请求过来往往是从表示层开始一层一层向下调用,那么如果我们在不同的层中都使用到了 EF 上下文对象,而 有好几层都这么创建一个 EF 对象然后对其进行操作,那么 ...

  8. .NET对象的创建、垃圾回收、非托管资源的手动处理

    本篇用来梳理对象的创建.垃圾的回收,以及非托管资源的手动处理. →首先运行应用程序,创建一个Windows进程. →CLR创建一块连续的虚拟地址空间,这个地址空间就是托管堆.而且,这个地址空间最初并没 ...

  9. 控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量

    我们知道,C++将内存划分为三个逻辑区域:堆.栈和静态存储区.既然如此,我称位于它们之中的对象分别为堆对象,栈对象以及静态对象.通常情况下,对象创建在堆上还是在栈上,创建多少个,这都是没有限制的.但是 ...

随机推荐

  1. 关于AfterLogic WebMail 的.net版无法上传控件的解决办法

    在使用AfterLogic WebMail做客户端的时候发现无论是在FF下还是在IE下发送邮件时附件怎么也无法上传,后来查看代码发现它使用的FLASH上传调用的上传代码是upload.php,问题就出 ...

  2. Oracle学习【语句查询】

    基本查询语句any和all不能单独使用,必须和比较符一起使用>any 大于最小的例如:select * from emp where sal >any(1000,2000);<any ...

  3. ubuntu亮度无法自动调节终极解决方案

    友情链接:IT狂人博客 这个问题纠结了我快两年,主要是自己懒,写了个脚本来调节亮度,不过还是稍显不便.近日兴起折腾了一番,终于找到问题根结了. There are many ways to contr ...

  4. Qt中,当QDockWidget的父窗口是一个不可以拖动的QTabWidget的时候实现拖动的方法

    之前在做有关QDockWidget的内容时候遇到了瓶颈,那就是窗口弹出来之后拖动不了,也不可以放大和缩小,若是弹出来之后设置成了window的flags,也不可以拖动,而且也不是需要的效果. 1.弹出 ...

  5. zoj1276矩阵连乘dp

    很经典的入门dp /*******************************************************************************/ /* OS : 3 ...

  6. Django练习项目之搭建博客

    背景:自从今年回家过年后,来到公司给我转了试用,我的学习效率感觉不如从前,而且刚步入社会我总是想要怎么想明白想清楚一些事,这通常会花掉,消耗我大量的精力,因为我想把我的生活管理规划好了,而在it技术学 ...

  7. android code 和js的交互

    小弟现在需要android code 和js的交互.出现了问题,求大家带一带啊. 我的页面:<!DOCTYPE html><html lang="en">& ...

  8. js&&node set_cookie、get_cookie

    js: function set_cookie(key, val,now){ var exdate = new Date(now); exdate.setDate(exdate.getDate() + ...

  9. __unset()魔术方法 删除类内私有属性

    __unset()魔术方法 删除私有属性 unset()对共有属性进行删除 可通过__unset()魔术方法对私有属性进行操作 当在类外部执行unset()函数时,自动执行类内__unset()魔术方 ...

  10. 禁用微信 webview 调整字体大小

    原文:http://www.grycheng.com/?p=2411 微信 webview 内置了调整字体大小的功能,对于网页的可用性来说是一个很实用的功能.一些网页的字体设置过小导致用户看不清文字, ...