清除TList或TObjectList

时间:2012-05-02 08:15:18

标签: delphi delphi-2007 tlist

我对用于在列表中存储对象的内容感到有点困惑。 到目前为止,我已经使用了TList并在循环中释放了每个项目。然后我发现TObjectList会自Free自动执行此操作。然后我从TList.Clear

的文档中看到了这一点
  

调用Clear清空Items数组并将Count设置为0. Clear   释放用于存储Items数组的内存,并将Capacity设置为0。

所以它基本相同。所以

代表TList

mylist.Clear;
myList.Free;

TObjectList相同?

myList.Free;

TObjectList只能将项目用作课程,还是可以存储记录?

5 个答案:

答案 0 :(得分:20)

<强> 1。 TList不会使用ClearFree释放元素。

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一样释放内存。