我对用于在列表中存储对象的内容感到有点困惑。
到目前为止,我已经使用了TList
并在循环中释放了每个项目。然后我发现TObjectList
会自Free
自动执行此操作。然后我从TList.Clear
:
调用
Clear
清空Items数组并将Count
设置为0.Clear
释放用于存储Items
数组的内存,并将Capacity
设置为0。
所以它基本相同。所以
代表TList
mylist.Clear;
myList.Free;
与TObjectList
相同?
myList.Free;
TObjectList
只能将项目用作课程,还是可以存储记录?
答案 0 :(得分:20)
<强> 1。 TList不会使用Clear
或Free
释放元素。
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。要存储记录列表,可以使用动态数组。
您将使用我们的dynamic array wrapper获取所有TList
方法(以及更多)。也就是说,Add / Delete / Clear / Count / IndexOf / Find
......
它具有内置的序列化功能(二进制或JSON),自动排序和比较(使用RTTI),TList/TObjectList
不存在。来自Delphi 5及更高版本。
使用更新的Delphi版本,如果您不想使用第三方库,可以使用 generics 来处理动态数组。
答案 1 :(得分:11)
它不同TList.Clear
只释放分配用于存储指针的内存,而不释放它们指向的对象。
为了避免内存泄漏,您需要自己释放内存 - 就像您一直在做的那样 - 或者使用TObjectList
。
要回答第二个问题,TObjectList
不支持存储记录。在这种情况下,您需要使用TList
(或其他内容)。
答案 2 :(得分:8)
如果您使用的是最新版本的Delphi,我建议您使用通用列表。
现在,当您使用列表中的对象时,可能需要进行大量的转换。使用通用列表,您不必再这样做了。
例如,如果你有:
TMyObject = class(TObject);
然后你就像这样列出:
TMyObjectList = TObjectList<TMyObject>;
Embarcadero Wiki上有一篇文章:
http://docwiki.embarcadero.com/CodeExamples/XE8/en/Generics_Collections_TObjectList_(Delphi)
答案 3 :(得分:8)
仔细阅读文档中的内容:
Clear还释放用于存储Items数组的内存
只释放数组本身的内存,而不释放数组中各个元素使用的内存。
答案 4 :(得分:-1)
真正关注contnrs.pas TObjectList
中的OwnObjects
代码无效。 FOwnObjects
是在TObjectList
的私有部分中声明的变量,在TObjectList
代码中的任何位置都没有使用(除了分配值),并且没有被覆盖的Clear
程序。
所以我担心有必要像TList
一样释放内存。