2010-12-23 75 views
3

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

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

或者,我可以通过简单地声明这些字段是公开的(甚至不必为使它们成为形式属性而烦恼)来“促进”我的记录类型为类类型。这是否被认为是好的,还是我应该花时间建立私人领域和公共财产的班级?

回答

10

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

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

+2

关键是一个记录是一个值类型,而一个类的实例是一个引用类型。真的需要了解这个区别。 – 2010-12-23 17:17:04