我必须存储一些可以在Delphi中轻松实现的记录(五个简单字段)。但是,当我做TList<TMyRecordType>.Add(R)
时,我不清楚会发生什么。
由于R是我创建my TList的过程中的局部变量,我假设函数返回时它的内存将被释放。这会在列表中留下无效的记录指针吗?或者列表是否知道要复制分配?如果是前者,我假设我必须使用New()和Dispose()手动管理R的内存,这是正确的吗?
或者,我可以通过简单地将字段声明为public(甚至没有使它们成为正式属性而烦恼)将我的记录类型“提升”为类类型。这是否可以,或者我是否应该花时间建立具有私人领域和公共财产的班级?
答案 0 :(得分:10)
简化:记录是数据的blob,默认情况下通过值传递 - 即通过复制它们。 TList<T>
将值存储在类型为T的数组中。因此,TList<TMyRecordType>.Add(R)
会将值R
复制到位置Count
的数组中,并将Count
增加一。无需担心内存的分配或释放。
您通常不需要担心的更复杂的问题:如果您的记录包含字符串类型,接口类型,动态数组或记录本身包含其中一种类型的字段的字段,那么它是不仅仅是简单的数据副本;相反,使用来自System.pas的CopyRecord,这可确保正确更新引用计数。但通常你不需要担心这个细节,除非你使用Move
来改变你自己的位,或做类似的低级操作。