gpt4 book ai didi

delphi - 在此过程中,Delete 是否做了任何事情?

转载 作者:行者123 更新时间:2023-12-03 15:38:59 25 4
gpt4 key购买 nike

在我收到且当前正在处理的一个项目中,当从列表中释放项目时,我多次看到此代码。

while Count > 0 do
begin
Items[0].Free;
Delete(0);
end;

使用FreeDelete(0)的目的是什么?

对元素调用 FreeAndNil() ,然后对列表调用 FreeAndNil() ,而不是使用 Delete ,这是一个更好的选择吗?我不明白为什么以前的开发人员会这样做在那里用过它。

最佳答案

需要删除才能从列表中删除第一项。这样,第二个项目将成为第一个项目,并且循环将继续,直到没有剩余项目为止。 Delete 所做的只是删除该项目,而 Free 则负责释放该项目所指向的对象。 FreeAndNil 不会有帮助,因为列表中仍然有 nil,而不是删除它(它可能无论如何都不会编译,因为 Item[i] 是一个可能是一个属性)。

不过,这个循环的效率可能相当低。如果这是一个 TList 或任何其他使用类似数组包装方法的类,那么这会导致大量内存移动。当您删除第一个项目时,所有其他项目实际上都会移动到内存中。

更好的解决方案。这个速度更快,因为它不进行大量的数组移位。

for i := 0 to Count - 1 do
Items[i].Free;
Clear;

其他解决方案(根据评论)

可能和上面的一样快。也不需要数组移位,更重要的是,您的列表中不会有过时的项目,因为它们会立即删除。

while Count > 0 do
begin
Items[Count-1].Free;
Delete(Count-1);
end;

也可以写成:

for i := Count - 1 downto 0 do
begin
Items[i].Free;
Delete(i);
end;

请注意,在多线程环境中,这可能仍然会导致问题,因为释放和删除项目不是原子的。有多种方法可以解决这个问题,但我认为这超出了本答案的范围。

甚至比上面的解决方案更好:使用 TObjectList(如果它还不是对象列表)。 TObjectList 有一个属性 OwnsObject,指示对象列表是否应该负责清理其中的对象。如果该属性为 True,您只需调用 Clear,它就会为您执行释放和删除操作。

关于delphi - 在此过程中,Delete 是否做了任何事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22645337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com