清除TList或TObjectList

Rol*_*son 15 delphi delphi-2007 tlist

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

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

所以它基本相同.所以

对于 TList

mylist.Clear;
myList.Free;
Run Code Online (Sandbox Code Playgroud)

是一样的TObjectList吗?

myList.Free;
Run Code Online (Sandbox Code Playgroud)

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

Arn*_*hez 20

1.从TList不会释放元件,具有两个ClearFree.

aList.Clear;

只是设置aList.Count := 0而不释放aList.Items[]元素.所以你会泄漏内存.你需要一个明确的免费版本:

for i := 0 to aList.Count-1 do
  TObject(aList[i]).Free;
Run Code Online (Sandbox Code Playgroud)

但这是什么TObjectList...... :)

关于TObjectList,值得说的TObjectList.Destroy就是打电话Clear.

所以

aObjectList.Clear;
aObjectList.Free;
Run Code Online (Sandbox Code Playgroud)

与...完全相同

aObjectList.Free;
Run Code Online (Sandbox Code Playgroud)

2.要存储记录列表,可以使用动态数组.

您将TList使用我们的动态数组包装器获得所有方法(以及更多).那就是Add / Delete / Clear / Count / IndexOf / Find......

它具有内置的序列化功能(二进制或JSON),自动排序和比较(使用RTTI),这些功能不存在TList/TObjectList.来自Delphi 5及更高版本.

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

  • 只是澄清了`TObjectList`.它有一个属性:`OwnsObjects`(default = true),它控制是否在删除项时释放列表中的对象. (4认同)

Ond*_*lle 12

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

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


Bir*_*ger 8

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

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

例如,如果你有:

TMyObject = class(TObject);
Run Code Online (Sandbox Code Playgroud)

然后你就像这样列出:

TMyObjectList = TObjectList<TMyObject>;
Run Code Online (Sandbox Code Playgroud)

Embarcadero Wiki上有一篇文章:

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


Rem*_*eau 8

阅读文档更仔细的内容:

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

只释放数组本身的内存,而不释放数组中各个元素使用的内存.