2010-12-23 43 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