san*_*206 3 delphi memory-management
在我收到的一个项目中,目前我正在研究,从列表中释放项目时,我已经看过几次这段代码了.
while Count > 0 do
begin
Items[0].Free;
Delete(0);
end;
Run Code Online (Sandbox Code Playgroud)
Delete(0)
使用后的目的是什么Free
?
它是一个更好的选择来调用FreeAndNil()
元素,然后是列表,而不是使用Delete
,我无法理解为什么以前的开发人员在那里使用它.
Gol*_*rol 12
删除列表中的第一个项目是必要的.这样,第二个项目成为第一个,循环继续,直到没有项目.一切Delete
都是,删除项目,同时Free
负责释放该项目所指向的对象.FreeAndNil不会帮助,因为你仍然有nil
在列表中,而不是去掉(它可能不会反正编译,因为Item[i]
是一个大概的属性).
但是,这个循环效率很低.如果这是一个TList,或任何其他使用类似数组包装方法的类,那么这会导致大量内存移动.删除第一个项目时,所有其他项目实际上都在内存中移动.
更好的解决方案.这个更快,因为它不会进行大量的数组移位.
for i := 0 to Count - 1 do
Items[i].Free;
Clear;
Run Code Online (Sandbox Code Playgroud)
其他解决方案(根据评论)
可能和上面一样快.也不需要数组移位,更重要的是,您不会在列表中包含过时的项目,因为它们会立即被删除.
while Count > 0 do
begin
Items[Count-1].Free;
Delete(Count-1);
end;
Run Code Online (Sandbox Code Playgroud)
哪个可以写成:
for i := Count - 1 downto 0 do
begin
Items[i].Free;
Delete(i);
end;
Run Code Online (Sandbox Code Playgroud)
请注意,在多线程环境中,这可能仍会造成麻烦,因为释放和删除项目不是原子的.有多种方法可以解决这个问题,但我认为这超出了这个答案的范围.
甚至比上面的解决方案更好:使用TObjectList(如果它还不是对象列表).TObjectList有一个属性OwnsObject,指示对象列表是否应该清理其中的对象.如果该属性为True,则可以直接调用Clear
,它将为您执行释放和删除操作.
归档时间: |
|
查看次数: |
148 次 |
最近记录: |