delphi - 了解 TList<RecordType> 的内存分配

标签 delphi memory-management delphi-2010

我必须存储一个可以在 Delphi 中轻松实现为记录的 TList(五个简单字段)。但是,我不清楚当我这样做时会发生什么 TList<TMyRecordType>.Add(R)

由于 R 是我创建 TList 的过程中的局部变量,因此我假设函数返回时将释放它的内存。这是否会在列表中留下无效的记录指针?或者列表是否知道分配时复制?如果是前者,我认为我必须使用 New() 和 Dispose() 手动管理 R 的内存,这是正确的吗?

或者,我可以通过简单地将字段声明为公共(public)(甚至无需将它们设置为正式属性)来将记录类型“提升”为类类型。这是否可以,或者我应该花时间构建具有私有(private)字段和公共(public)属性的类?

最佳答案

简化:记录是数据 block ,默认情况下按值传递(即通过复制它们)。 TList<T>将值存储在 T 类型的数组中。因此,TList<TMyRecordType>.Add(R)将复制值 R进入数组的位置Count ,并增加 Count一个。无需担心内存的分配或释放。

您通常不需要担心的更复杂的问题:如果您的记录包含字符串类型、接口(interface)类型、动态数组的字段,或者记录本身包含这些类型之一的字段,那么它是不仅仅是数据的简单副本;相反,使用 System.pas 中的 CopyRecord,这可确保正确更新引用计数。但通常你不需要担心这个细节,除非你使用 Move移动自己周围的位,或执行类似的低级操作。

关于delphi - 了解 TList<RecordType> 的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4520673/

相关文章:

delphi - Delphi中的静态多态

delphi - 对内存中的文件进行排序

delphi - 使用 Vcl 样式时更改 TActionMainMenuBar 的字体

delphi - system.str 的警告

delphi - 如何从资源管理器启动 RAD Studio 的新实例

c# - 当我们在 C# 中重新分配数组时,数组的值是否被破坏?

delphi - 如何为我的组件创建文件夹(目录)属性编辑器?

delphi - 序列化 TdwsProgram

iphone - ARC 不释放实例变量

c - c内存管理的一个很好的比喻是什么?