我对如何在列表中存储对象感到有点困惑。到目前为止,我已经使用了TList
并释放了循环中的每个项。然后,我发现TObjectList
自动从Free
中执行此操作。然后我从TList.Clear
的医生那里看到这个
调用
Clear
来清空Item数组,并将Count
设置为0。Clear
还释放用于存储Items
数组的内存,并将Capacity
设置为0。
所以基本上是一样的。所以
对于TList
mylist.Clear;
myList.Free;
与TObjectList
相同。
myList.Free;
TObjectList
只能用于作为类的项,还是可以存储记录?
发布于 2012-05-02 08:41:23
Clear
1. TList不会释放元素,或TList都不会释放这些元素
aList.Clear;
将只设置aList.Count := 0
而不释放aList.Items[]
元素。所以你会漏掉记忆。您将需要这样一个显式的免费:
for i := 0 to aList.Count-1 do
TObject(aList[i]).Free;
但这就是TObjectList
做的.:)
关于TObjectList
,值得指出的是,TObjectList.Destroy
正在调用Clear
。
所以
aObjectList.Clear;
aObjectList.Free;
完全相同
aObjectList.Free;
2.要存储记录列表,可以使用动态数组.
您将使用我们的TList
获得所有的动态数组包装器方法(以及更多)。就是,Add / Delete / Clear / Count / IndexOf / Find
..。
它内置了序列化特性(二进制或JSON)、自动排序和比较(使用RTTI),这些特性与TList/TObjectList
不存在。从德尔福5和更高版本。
使用更现代版本的Delphi,如果不想使用第三方库,则可以使用泛型来处理动态数组。
发布于 2012-05-02 08:18:27
它不是同一个TList.Clear
,它只释放分配给存储指针的内存,而不是它们所指向的对象。为了避免内存泄漏,您需要自己释放内存--就像您一直在做的那样--或者使用TObjectList
。
为了回答第二个问题,TObjectList
不支持存储记录。在这种情况下,您需要使用TList
(或其他什么)。
发布于 2012-05-02 18:56:10
更仔细地阅读文档中的内容:
清除也释放用于存储项数组的内存。
只释放数组本身的内存,而不释放数组中单个元素使用的内存。
https://stackoverflow.com/questions/10410019
复制相似问题