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

2023-11-05

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最好不要省。 
而且还要用try...finally...end装起来。 
这样即使你在过程中出现异常,也能保证资源能够释放。
但是为了可靠性和可读性,这个Free最好不要省。 
而且还要用try...finally...end装起来。 
这样即使你在过程中出现异常,也能保证资源能够释放。

 向你这样,一定要FREE,否则就会有Memory   Leak。 
但是如果形如x   :=   TX.Create(Application)这样,可以不Free,那么在Application被Free时,Application会替你free的。 
 

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中继承过来的。把您的注销放在tryfinally程序模块的finally部分, 

  而把对象的程序代码放在try部分是编程的好习惯。这样,即使您的程序代码在使用对象时发生了异常事件, 

  也会确保您为这个对象分配的内存会被释放。 

  二者的区别是,Destroy 会直接释放对象, 

  而Free会事实检查该对象是否存在,如果对象存在,或者对象不为nil,它才会调用Destroy。 

  因此,程序中应该尽量使用free来释放对象,这样更加安全一些。 

  (但要注意,free 也不会自动将对象置为nil,所以在调用free之后,最好是再手动将对象置为nil。) 

  TObject类有一个虚拟的Destroy虚构函数和一个非虚拟的Free函数。Free函数中是调用Destroy的。 

  因此,当我们对任何对象(都是TObject的子类对象)调用.Free();之后,都会执行TObject.Free(); 

  它会调用我们所使用的对象的析构函数Destroy();。这就保证了任何类型的对象都可以正确地被析构。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 对象的引用计数

    在我的代码中 我使用一个小的数据存储类 它是在不同的地方创建的 为了避免内存泄漏并简化事情 我想使用引用计数 所以我这样做了 type TFileInfo class TInterfacedObject IInterface 并删除了我对
  • 如何在Delphi中显示Vista风格的气球提示?

    在输入验证时 我使用气球提示而不是消息框 我的问题是 在 Vista 上 它们具有带圆角的旧 XP 样式 而不是较新的矩形外观 我尝试使用 CreateWindowEx 创建它们并且tooltips class32或使用 SendMessa
  • 通过套接字发送动态数组(在记录内)?

    我正在尝试直接使用 SendBuf 将记录从服务器传输到客户端 但是 该记录有一个动态数组的成员 并且我在某处 在 SOF 中 读到 发送记录时 成员必须是静态的 固定长度 但问题是 我无法确定如何我会 将来 发送许多论点 我怎么解决这个问
  • 使用 PutBlock 并将字节数组全部设置为零的 EIPHTTPProtocolExceptionPeer 异常

    使用 Delphi XE2 Update 3 我在将零字节块上传到 Azure 时遇到问题 当我说零字节时 我指的是每个元素设置为零的字节数组 不是零长度 例如 var ConInfo TAzureConnectionInfo RespIn
  • Delphi 7 - 处理表单中嵌入框架的 MouseWheel 事件?

    你好 我有一个表格 里面有几个框架 对于某些框架 我希望滚动内容 或至少处理鼠标滚轮事件 我已经尝试过以下方法 只需为每个帧分配一个 OnMouseWheel 事件处理程序 重写父窗体的 MouseWheel 事件 procedure TF
  • 似乎有时 Delphi 是区分大小写的 - “覆盖方法应该与祖先的大小写匹配”

    今天我遇到了一个 奇怪 的提示 覆盖方法 xxxx 应匹配祖先 yyyy 的大小写 解决方案是完全按照祖先中的方式声明方法名称 我相信这是自 Delphi Net 编译器以来编译器中保留的东西 与祖先中完全相同的方法声明方法使编译器 沉默
  • MainFormOnTaskbar + 工具提示导致焦点窃取

    我使用 Delphi XE2 构建了下面的代码 它创建 Form1 Form1 立即创建 Form2 的实例 当我按下 Form2 上的按钮时 会创建第二个 Form2 现在 如果我将鼠标悬停在第二个 最上面的 Form2 上的按钮上 并等
  • Delphi - 如何使用 iPhone 作为图片源通过 OpenDialog 获取目录

    我有一个 Delphi 应用程序 D2010 它允许用户通过 OpenDialog 选择 JPG 文件 当我从普通 Windows 目录中选择文件时 我的 TOpenDialog Filename 包含该文件的完整路径 并且我的代码可以正常
  • 德尔福和Doxygen

    我想使用 doxygen pas2dox 记录我的源代码 当我设置好所有内容 包括过滤器和提取选项 提取所有内容 时 doxygen 运行良好 但生成的文档仅包含源文件作为链接 并且没有提取类型 方法 过滤后的源看起来不错 有任何提示如何定
  • 在 Delphi 中获取 TCheckbox 的总大小,包括框和文本

    我想获得 TCheckbox 的总大小 包括 Delphi 中的框和文本 我查看这篇文章Delphi FMX TCheckbox TRadiobutton 自动调整大小 https stackoverflow com questions 4
  • VirtualStringTree 正确/推荐使用

    我已经使用 virtualstringtree 一段时间了 我将它用于两个不同的用途 第一个是用于选择 显示数据的普通树 第二个是作为网格来显示 SQL 语句的输出 我加载到树中的所有数据都来自数据库 对于树示例 我有一个 ParentId
  • 从 Delphi 访问 TRAKT API - 承载身份验证问题

    使用 TOauth2Authenticator TRESTClient TRESTRequest TRESTResponseDataSet TRESTResponse TFDmemtable 和 TDataSource 我成功连接到 Tra
  • 新编译的应用程序需要 UAC/elevation?

    我有一个系统 我将其设置为普通的 UAC 并在我的 delphi 环境中编译名为 ka exe 的项目 并为其创建一个 installshield 项目 设置完毕 一切顺利 但每当我开始我的程序时 它都需要提升 而我不知道为什么 为了确保
  • Delphi 是否在构造对象之前分配变量?

    Delphi 是否在对象完全构造之前分配实例变量 换句话说 给定一个变量 var customer TCustomer nil 然后我们构造一个客户并将其分配给变量 customer TCustomer Create 有没有可能custom
  • 我有进程 ID,需要使用 Delphi 5 以编程方式关闭关联进程

    任何人都可以帮我提供一个编码示例 以便在我拥有进程 ID 时关闭关联的进程 我将使用 Delphi 5 在 Windows 2003 服务器上以编程方式执行此操作 如果您有进程 ID 并希望强制终止该进程 可以使用以下代码 function
  • Firebird 或 NexusDB

    我知道有很多与 Delphi 数据库相关的问题 但我只考虑这两个数据库 我需要查询大约 100 000 条记录 根据您的经验 哪个更快 作为嵌入式 as C S Thanks 我还没用过 Nexus tbh 但我经常使用 Firebird
  • 在 XMLDocument 中使用 DocumentElement 时发生访问冲突

    当我尝试使用时 我总是遇到访问冲突DocumentElement of the XMLDocument 我创造XMLDocument基于某些文件的存在 错误信息 项目project1 exe引发异常类EAccessViolation 消息
  • 是否可以在虚拟树视图中选择多个列?

    我需要添加功能来复制节点和列的矩形选择 但我找不到任何方法来实际选择虚拟树视图中的多个列 除了 toFullRowSelect 之外 我只是错过了什么吗 如果没有 是否有一个后代具有类似网格的多列选择支持 经过一些测试后 我得出了以下结论
  • 在该对象调用的事件期间销毁该对象

    我有一个按钮 它的 OnClick 事件调用一个销毁按钮的过程 但随后 线程 想要返回到 OnClick 事件 并且我遇到了访问冲突 我完全被难住了 您需要在按钮的所有代码执行完毕后销毁该按钮 执行此操作的标准方法是将用户定义的消息发布到表
  • 在 tlistbox 中绘制缩略图

    在 DelphiXE 中 我使用 tFileOpenDialog 选择一个文件夹 然后在 tListBox 中列出该文件夹中的所有 jpg 文件 我允许将列表项拖放到列表中进行自定义排序 以便稍后按顺序显示它们 我希望能够在文件名旁边绘制图

随机推荐

  • 树的遍历(中序,前序,后序)

    与只有一种逻辑遍历它们的线性数据结构 数组 链表 队列 堆栈等 不同 树可以以不同的方式遍历 常见的有中序遍历 前序遍历和后序遍历 实现各种遍历的方法又包括 以上图为例 深度优先遍历 a 中序 左 根 右 4 2 5 1 3 b 前序 根
  • 关于async & await(TAP)异步模型的异常捕获

    在TAP之前 若要捕获线程中Task的异常 通常有两种办法 1 阻塞 线程开始后 在适当的时机 调用 wait 或waitAll方法 2 非阻塞 推荐 在建立任务的时候 写该task的continueWith方法 在该方法中捕获异常 对于T
  • get提交和post提交的区别

    Http定义了与服务器交互的不同方法 最基本的方法有4种 分别是GET POST PUT DELETE URL全称是资源描述符 我们可以这样认为 一个URL地址 它用于描述一个网络上的资源 而HTTP中的GET POST PUT DELET
  • Linux安装以及使用

    Linux虚拟机安装以及使用 1 安装VMware16 2 创建虚拟机 3 虚拟机配置网络 4 利用mobaxterm连接服务器 5 配置jdk和tomcat 6 配置docker和mysql 7 部署项目 1 安装VMware16 接下来
  • leetcode160–相交链表(最优解/双指针)

    今天做的三道题比较简单 给你两个单链表的头节点 headA 和 headB 请你找出并返回两个单链表相交的起始节点 如果两个链表不存在相交节点 返回 null 题目数据 保证 整个链式结构中不存在环 注意 函数返回结果后 链表必须 保持其原
  • ISA(MIPS,ARM,RISC-V)中的算术运算溢出检测逻辑是怎样的?

    关于ISA架构 之前写过一些总结 这里单独将其中一个技术点拿出来 对比分析不同架构下实现的差异 这个技术点就是算术指令中的溢出检测 ARM体系结构中 通过CPSR的状态寄存器反映当前指令的溢出状态 而MIPS 则是通过指令触发中断的方式产生
  • Jenkins使用(代码拉取->编译构建->部署上线)

    Jenkins简介 Jenkins是一个开源项目 提供了一种易于使用的持续集成系统 使开发者从繁杂的集成中解脱出来 专注于更重要的业务逻辑实现上 同时Jenkins能实时监控集成中存在的错误 提供详细的日志文件和提醒功能 还能用图表的形式形
  • Java——(1)定义一个学生类Student,包含属性:姓名(String name)、年龄(int age) (2)定义Map集合,用Student对象作为key

    分析以下需求 并用代码实现 1 定义一个学生类Student 包含属性 姓名 String name 年龄 int age 2 定义Map集合 用Student对象作为key 用字符串 此表示表示学生的住址 作为value 3 利用四种方式
  • db2异常

    一 db2 SQL0180N The syntax of the string representation of a datetime value is incorrect SQLSTATE 2200 问题描述 在用import导入时没有
  • qt入门级使用

    qt的安装 可参考 QT下载安装及配置教程 亲测好用 qt基本使用 1 创建第一个qt程序 打开后欢迎界面如下 这是关于qt的一些项目的讲解 不过视频地址在国外 需要翻qiang才能看 而且全是英文 左边还有一个 示例 那里面有各种项目的模
  • Android开发之RecyclerView的使用全解

    转自 http blog csdn net dmk877 article details 50816933 自Android 5 0之后 谷歌公司推出了RecylerView控件 RecylerView 我想看到一个新名词后大部分人会首先发
  • 微分动态规划

    from https en wikipedia org wiki Differential dynamic programming 深入理解DDP DDP是一种轨迹优化类别问题中的最优控制算法 这种算法在1966年被Mayne提出 该算法使
  • PostgreSQL 性能优化

    提出问题 PostgreSQL数据库如何进行简单的性能调优 解决问题 前言 PostgreSQL的配置参数作为性能调优的一部分 起着重要的位置 有时候一个简单的配置参数就会决定应用的性能 因此有必要简单了解下其相关的配置参数 查询Linux
  • Hadoop(三)读写流程

    Remote Procedure Call RPC 远程过程调用协议 它是一种通过网络从远程计算机程序上请求服务 而不需要了解底层网络技术的协议 RPC协议假定某些传输协议的存在 如TCP或UDP 为通信程序之间携带信息数据 在OSI网络通
  • 数据库基础命令

    SELECT 从数据库中提取数据 SELECT column name column name FROM table name SELECT DISTINCT column name column name FROM table name
  • Numpy

    文章目录 1 Numpy是什么 2 ndarray 2 1 什么是ndarray 2 2 ndarray的属性 2 3 ndarray的类型 3 Numpy基本操作 3 1 生成0或1的数组 3 2 从现有数组生成数组 拓展 浅拷贝和深拷贝
  • 在Excel中如何引用其他的工作表或者工作簿

    http www office68 com excel 426 html 公式中对单元格和单元格区域的引用不必非得针对同一个工作表中的单元格和单元格区域 如果要引用另外的工作表中的单元格 那么就在单元格引用的前面加上工作表的名称以及一个感叹
  • ssl协议及开源实现openssl

    转载地址 https blog csdn net jinbusi blog article details 76039206 locationNum 4 fps 1 ssl协议 SSL Secure Socket Layer 安全套接层 s
  • Rsync的核心算法

    一 什么是Rsync 1 rsync 是 unix linux 下同步文件的一个高效算法 它能同步更新两处计算机的文件和目录 并适当的利用查找文件中的不同块以减少数据传输 2 rsync中一项与其他大部分类似程序或协定中所未见的重要特性是镜
  • Delphi 对象的创建(create)与释放(free/destory)

    create后一定要free吗 简单举例 procedure a var x TX begin x TX create do someting x free 如果我这里不free 到了这个end不就是相当于C中的 自动释放吗 也就是说在此处