清除从TList或TObjectList(Clear a TList or a TObjectLis

2019-07-29 05:56发布

我有点疑惑的是什么,以用于在列表中存储对象。 到现在为止我已经使用TList并在循环中解脱出来的每个项目。 后来我发现TObjectList从自动执行此Free 。 然后,我看到这个从商务部TList.Clear

呼叫Clear清空项目阵列和设置Count为0 Clear还释放用于存储所述存储器Items数组并设置Capacity为0。

因此,它基本上是相同的。 所以

对于TList

mylist.Clear;
myList.Free;

是一样的TObjectList

myList.Free;

可以TObjectList只能用于项目类或我可以存储记录?

Answer 1:

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.要存储的记录列表,你可以使用一个动态数组。

你会得到所有TList方法(和更多)与我们的动态数组封装 。 也就是说, Add / Delete / Clear / Count / IndexOf / Find ...

它具有内置的序列特征(在二进制或JSON),自动分拣和不与现有的比较(使用RTTI) TList/TObjectList 。 德尔福5及更高版本。

随着越来越多的现代版本的Delphi,你可以使用泛型来处理动态数组,如果你不希望使用第三方库。



Answer 2:

它是不一样的TList.Clear仅释放分配存储指针,它们都指向不是对象的内存。 为了避免内存泄漏,你需要自己释放内存-因为你一直在做的-或使用TObjectList

要回答第二个问题, TObjectList不支持存储记录。 您需要使用TList在这种情况下(或别的东西)。



Answer 3:

读什么的文档更仔细地说:

清除还释放用于存储物品阵列的存储器

仅用于阵列本身的内存被释放,而不是由阵列内单独的元件中使用的存储器。



Answer 4:

如果您使用的是德尔福最新版本的,我建议你使用一个通用的清单。

现在,你可能需要当你从列表中使用的对象做了很多铸造的。 随着通用的清单,你不必这样做了。

例如,如果您有:

TMyObject = class(TObject);

然后,你使列表如下:

TMyObjectList = TObjectList<TMyObject>;

有一个在英巴卡迪诺维基的文章:

http://docwiki.embarcadero.com/CodeExamples/XE8/en/Generics_Collections_TObjectList_(Delphi)



Answer 5:

真的看TObjectList代码contnrs.pas OwnObjects什么都不做。 FOwnObjects是私处声明的变量TObjectList未在任何地方使用TObjectList代码(除刚刚分配值),并没有覆盖Clear它的过程。

所以,恐怕有必要释放内存只是一样TList



文章来源: Clear a TList or a TObjectList