(delphi11最新学习资料) Object Pascal 学习笔记---第13章第3节 (内存管理技巧 )

13.3 内存管理技巧

Object Pascal中的内存管理遵循三个简单的规则:您必须创建每个对象并分配您需要的每个内存块;您必须销毁您创建和分配的每个对象和内存块;每个对象仅销毁一次。对于动态元素(即不在堆栈和全局内存区域中的元素),Object Pascal 支持三种类型的内存管理,详见本节的剩余部分:

  • 每次创建对象时,都应同时销毁该对象。如果不这样做,该对象使用的内存将不会被释放给其他对象,直到程序终止。

  • 当您创建组件时,可以指定一个所有者组件,并将所有者传递给组件构造函数。所有者组件(通常是表单或数据模块)负责销毁它拥有的所有对象,当所有者组件被销毁时,它会自动销毁这些对象。换句话说,当您销毁表单或数据模块时,它会销毁它拥有的所有组件。因此,如果您创建组件并为其指定一个所有者,则无需担心销毁它,但是您仍然可以通过TComponent类提供的销毁通知机制提前销毁它。

  • 当您为字符串、动态数组和由接口类型变量引用的对象分配内存(如第11章所述)时,Object Pascal会在引用超出作用域时自动释放内存。您不需要释放字符串,因为当它变得不可访问时,其内存会自动释放。如果您需要提前释放它以释放内存空间,则可以将字符串或动态数组变量分配为nil,或将空字符串分配给字符串变量。

13.3.1 销毁你创建的对象

​ 在大多数简单场景下,您必须销毁自己创建的临时对象。而任何非临时对象都应该有一个所有者,或者是某个集合的一部分,或者被某个数据结构引用,由该数据结构负责在适当的时候销毁对象。

​ 用于创建和销毁临时对象的代码通常封装在一个 try-finally 代码块中,这样即使在使用临时对象时出了问题,该对象也会被销毁。

pascalCopy codeMyObj := TMyClass.Create;
try
  MyObj.DoSomething;
finally
  MyObj.Free;
end;

​ 另一种常见的情况是,一个对象由另一个对象使用,并成为其所有者:

constructor TMyOwner.Create;
begin
  FSubObj := TSubObject.Create;
end;

destructor TMyOnwer.Destroy;
begin
  FSubObj.Free;
end;

​ 还有一些常见的更复杂的情况,比如在需要时才创建主体(延迟初始化),或者在不再需要主体时,先于所有者销毁主体。

​ 要实现延迟初始化,就不能在所有者的构造函数中创建主体、 而是在需要时创建:

function TMyOwner.GetSubObject: TSubObject;
begin
  if not Assigned(FSubObj) then
    FSubObj := TSubObject.Create;
  Result := FSubObj;
end;

destructor TMyOnwer.Destroy;
begin
  FSubObj.Free;
end;

​ 请注意,上述代码依赖于对象在首次创建时进行内存初始化,这意味着 FSubObj 将为 nil。还要注意,您在释放对象之前无需测试对象是否已赋值,因为这正是 Free 方法所做的,我们将在下一节中看到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/643966.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

指纹识别概念解析

目录 1. 指纹是物证之首 1.1 起源于中国 1.2 发展于欧洲 1.3 流行于全世界 2. 指纹图像 3. 指纹特征 4. 指纹注册 5. 指纹验证 6. 指纹辨识 1. 指纹是物证之首 指纹识别技术起源于中国、发展于欧洲、流行于全世界。自20世纪以来,指纹在侦破刑事案件、解决诉…

《图解支付系统设计与实现》电子书_V20240525

相较于上次公开发布的V20240503版本,变更内容如下: 根据掘金网友zz67373(李浩铭)的勘误建议,优化了部分描述。增加:金额处理规范,低代码报文网关实现完整代码,分布式流控等内容。扩…

CSS语法介绍

文章目录 前言一、CSS引入方式1.行内操作2.内部操作3.外部操作 二、常用选择器1.标签选择器2.类选择器3.id选择器4.群组选择器5.后代选择器 三、字体常用设置1.字体类型2.字体大小3.字体样式4.字体粗细 四、div盒子模型1.盒子边框2.外边距3.内边距4.浮动 综合实战案例 前言 以…

每日一题 求和

1.题目解析 求和_牛客题霸_牛客网 (nowcoder.com) 这一题,主要描述的就是求满足和为m的子序列,对与子序列的问题可以使用决策树。 2.思路分析 决策树如下图所示: 递归结束条件: 当当前和 sum 等于目标和 m 时,说明找到了一个满…

Java+Swing+Mysql实现飞机订票系统

一、系统介绍 1.开发环境 操作系统:Win10 开发工具 :Eclipse2021 JDK版本:jdk1.8 数据库:Mysql8.0 2.技术选型 JavaSwingMysql 3.功能模块 4.数据库设计 1.用户表(users) 字段名称 类型 记录内容…

aws 接入awsIOT平台的证书签发逻辑

参考资料 https://aws.amazon.com/cn/blogs/china/certification-vending-machine-intelligent-device-access-aws-iot-platform-solution/ IoT 设备与 AWS IoT Core 的 MQTT 通信使用基于证书的 TLS 1.2双向认证体系。所谓的双向认证,即意味着 IoT 设备端需安装 …

Redis 性能管理

一、Redis 性能管理 #查看Redis内存使用 172.168.1.11:6379> info memory 1. 内存碎片率 操作系统分配的内存值 used_memory_rss 除以 Redis 使用的内存总量值 used_memory 计算得出。内存值 used_memory_rss 表示该进程所占物理内存的大小,即为操作系统分配给…

谈谈你对 vue 的理解 ?

1.谈谈你对 vue 的理解 ? 官方: Vue是一套用于构建用户界面的渐进式框架,Vue 的核心库只关注视图层 2. 声明式框架 Vue 的核心特点,用起来简单。那我们就有必要知道命令式和声明式的区别! 早在 JQ 的时代编写的代码都是命令式的,命令式框架重要特点就是关注过程 声明…

13个PyTorch深度学习案例简介

本文整理《PyTorch深度学习与企业级项目实战》中项目案例所使用的模型,方便大家在学习、研究深度学习过程中做训练使用,这些案例也适合作为课程论文、毕业论文的素材,值得收藏和推荐。 第6章 迁移学习花朵识别项目实战 花朵数据集 ResNet…

Unity射击游戏开发教程:(26)创建绕圈跑的效果

unity游戏 在本文中,我将介绍如何为敌人创建圆周运动。gif 中显示的确切行为是敌人沿着屏幕向下移动,直到到达某个点,一旦到达该点,它就会绕圈移动。

F28034中断

DSP中断 中断中断概述中断机制 中断 当CPU正在执行程序时,由于发生了某种随机的事件(外部或内部),使CPU的执行中断,转而去执行某一段特殊的程序(中断子程序或中断处理程序),以处理该…

LeetCode算法题:42. 接雨水(Java)

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3…

(完全解决)Python字典dict如何由键key索引转化为点.dot索引

文章目录 背景解决方案基础版升级版 背景 For example, instead of writing mydict[‘val’], I’d like to write mydict.val. 解决方案 基础版 I’ve always kept this around in a util file. You can use it as a mixin on your own classes too. class dotdict(dict)…

前端 JS 经典:Web 性能指标

什么是性能指标:Web Performance Metrics 翻译成 Web 性能指标,一般和时间有关系,在短时间内做更多有意义的事情。 一个站点表现得好与不好,标准在于用户体验,而用户体验好不好,有一套 RAIL 模型来衡量。这…

基于SpringBoot的网盘系统设计与实现

第1章 绪论... 1 1.1 研究背景与意义... 1 1.1.1 研究背景... 1 1.1.1 研究意义... 1 1.2 国内外研究现状... 2 1.2.1 国内研究现状... 2 1.2.2 国外研究现状... 3 1.3 论文组织架构... 4 第2章 关键技术介绍... 5 2.1 SpringBoot. 5 2.2 MySQL数据库... 5 2.3 MVC架…

Altium Designer 中键拖动,滚轮缩放,并修改缩放速度

我的版本是AD19,其他版本应该都一样。 滚轮缩放 首先,要用滚轮缩放,先要调整一下AD 设置,打开Preferences,在Mouse Wheel Configuration 里,把Zoom Main Window 后面Ctrl 上的对勾取消掉,再把…

下载和安装AD19 - Altium Designer 19.1.9 Build 167

虽然有AD24 的安装资源,但是我比较喜欢19 这个数字[doge] 下载 仍然是从毛子网站源头进货:https://rutracker.net/forum/viewtopic.php?t5754276,网盘: https://pan.baidu.com/s/1ic31N4h7HS2FBu7JFll0YQ?pwdvjum 提取码: vjum 安装 压…

IDEA主题Drcula个性化改造

Darcula 主题整体色调看着舒服,但是代码区分不直观,比如直接看代码是看不出这个这个是类、接口、抽象类、枚举还是啥,而且左侧图标也很难区分。 该主题基于Darcula主题对类、接口、抽象类、注解在编辑区按颜色做了区分,同时图标也…

Nature期刊的等级和分类

Nature期刊不用过多介绍,学术界人员都对其有所了解,可以和Science,Cell比肩,Nature旗下创办了很多子刊,系列期刊有一百多种,当然其含金量各有不同,nature旗下的期刊等级你是否都了解了。 Nature…

通过继承React.Component创建React组件-5

在React中,V16版本之前有三种方式创建组件(createClass() 被删除了),之后只有两种方式创建组件。这两种方式的组件创建方式效果基本相同,但还是有一些区别,这两种方法在体如下: 本节先了解下用extnds Reac…