首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >清除TList或TObjectList

清除TList或TObjectList
EN

Stack Overflow用户
提问于 2012-05-02 08:15:17
回答 5查看 30.5K关注 0票数 16

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

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

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

对于TList

代码语言:javascript
运行
复制
mylist.Clear;
myList.Free;

TObjectList相同。

代码语言:javascript
运行
复制
myList.Free;

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-02 08:41:23

Clear 1. TList不会释放元素,TList都不会释放这些元素

aList.Clear;

将只设置aList.Count := 0而不释放aList.Items[]元素。所以你会漏掉记忆。您将需要这样一个显式的免费:

代码语言:javascript
运行
复制
for i := 0 to aList.Count-1 do
  TObject(aList[i]).Free;

但这就是TObjectList做的.:)

关于TObjectList,值得指出的是,TObjectList.Destroy正在调用Clear

所以

代码语言:javascript
运行
复制
aObjectList.Clear;
aObjectList.Free;

完全相同

代码语言:javascript
运行
复制
aObjectList.Free;

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

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

它内置了序列化特性(二进制或JSON)、自动排序和比较(使用RTTI),这些特性与TList/TObjectList不存在。从德尔福5和更高版本。

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

票数 23
EN

Stack Overflow用户

发布于 2012-05-02 08:18:27

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

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

票数 13
EN

Stack Overflow用户

发布于 2012-05-02 18:56:10

更仔细地阅读文档中的内容:

清除也释放用于存储项数组的内存。

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10410019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档