delphi - 清除 TList 或 TObjectList

标签 delphi delphi-2007 tlist

我对使用什么来存储列表中的对象有点困惑。 到目前为止,我已经使用了 TList 并释放了循环中的每个项目。然后我发现 TObjectList 可以从 Free 自动执行此操作。然后我从 TList.Clear 的文档中看到了这一点:

Call Clear to empty the Items array and set the Count to 0. Clear also frees the memory used to store the Items array and sets the Capacity to 0.

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

对于TList

mylist.Clear;
myList.Free;

TObjectList相同吗?

myList.Free;

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

最佳答案

<强>1。无论使用 ClearFree,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。要存储记录列表,您可以使用动态数组。

您将通过我们的 dynamic array wrapper 获得所有 TList 方法(以及更多) 。即添加/删除/清除/计数/IndexOf/查找...

它具有内置的序列化功能(二进制或 JSON)、自动排序和比较(使用 RTTI),这些功能是 TList/TObjectList 所不具备的。从 Delphi 5 及更高版本开始。

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

关于delphi - 清除 TList 或 TObjectList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10410019/

相关文章:

delphi - 在Delphi中显示多行文本的组件

multithreading - 主线程繁忙时在 Delphi 中显示启动屏幕

delphi - 如何将 record 类型的记录添加到 TList<> 中?

delphi - 如何在派生类型中使用泛型方法

delphi - 在 Delphi 中对备忘录进行排序

Delphi 2009 - 对象检查器中的自定义枚举类型属性

delphi - TPageControl.OnChange 中的缓慢事件处理程序会导致奇怪的行为

multithreading - 用于非阻塞多线程同步的 Lock-Free、Wait-Free 和 Wait-freedom 算法

delphi - tcxGrid 使用 TList 作为数据源

delphi - 为什么释放不为空的TList <Int64>不会导致内存泄漏?