了解TList <recordtype> </recordtype>的内存分配

时间:2010-12-23 16:38:12

标签: delphi memory-management delphi-2010

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

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

或者,我可以通过简单地将字段声明为public(甚至没有使它们成为正式属性而烦恼)将我的记录类型“提升”为类类型。这是否可以,或者我是否应该花时间建立具有私人领域和公共财产的班级?

1 个答案:

答案 0 :(得分:10)

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

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

相关问题