16

我对使用什么将对象存储在列表中感到有些困惑。到目前为止,我已经TList在一个循环中使用并释放了每个项目。然后我发现TObjectListFree. 然后我从以下文档中看到了这一点TList.Clear

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

所以基本上是一样的。所以

为了TList

mylist.Clear;
myList.Free;

和 for 一样TObjectList吗?

myList.Free;

只能TObjectList用于作为类的项目还是可以存储记录?

4

5 回答 5

23

1. TList 不会释放元素,同时使用Clearor Free

aList.清除;

只会设置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. 从 Delphi 5 及更高版本开始。

使用更现代的 Delphi 版本,如果您不想使用第三方库,可以使用泛型来处理动态数组。

于 2012-05-02T08:41:23.000 回答
13

这不一样TList.Clear只释放分配用于存储指针的内存,而不是它们指向的对象。为避免内存泄漏,您需要自己释放内存 - 正如您一直在做的那样 - 或使用TObjectList.

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

于 2012-05-02T08:18:27.040 回答
10

仔细阅读文档所说的内容:

Clear 还会释放用于存储 Items 数组的内存

只有数组本身的内存被释放,而不是数组内单个元素使用的内存。

于 2012-05-02T18:56:10.053 回答
9

如果您使用的是最新版本的 Delphi,我建议您使用通用列表。

现在,当您使用列表中的对象时,您可能需要进行大量转换。有了通用列表,您就不必再这样做了。

例如,如果您有:

TMyObject = class(TObject);

然后你制作这样的列表:

TMyObjectList = TObjectList<TMyObject>;

Embarcadero Wiki 中有一篇文章:

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

于 2012-05-02T08:54:36.350 回答
-1

真正看TObjectListcontnrs.pas 中的代码OwnObjects什么也没做。FOwnObjects是一个在其私有部分中声明的变量TObjectList,它不会在TObjectList代码中的任何地方使用(除了分配值),并且其中没有被覆盖Clear的过程。

所以恐怕有必要像TList.

于 2013-11-21T11:14:45.583 回答