删除TList中的TList

时间:2011-03-25 14:13:32

标签: delphi free tlist

我正在尝试在onDestroy事件中的Tlist中释放Tlist,而FastMM4正在引发访问冲突错误。这是代码段。

procedure TSignalFrm.FormDestroy(Sender: TObject);
var
  x,y: integer;
begin
  for x := 0 to signalList.Count - 1 do
  begin
    for y:=0 to TSignal(SignalList.Items[x]).alarmList.Count-1 do
    begin
      TAlarm(TSignal(SignalList.Items[x]).alarmList.Items[y]).Free;
    end;
    TSignal(SignalList.Items[x]).AlarmList.Free;
    TSignal(SignalList.Items[x]).Free;
  end;
  SignalList.Free;
end;

我在TSignal(SignalList.items [x])收到访问冲突错误。线。在释放SignalList项之前释放AlarmList项会引发访问冲突错误,但是为什么?

更新:我在Windows XP上使用Delphi 7.0。实际的FastMM4消息如下。


FastMM检测到尝试在释放的对象上调用虚方法。现在将引发访问viloation以中止当前操作。

Freed Object class:TList

虚拟方法:销毁

虚拟方法地址:427CF0

分配编号为:80055

接着是大量的内存转储。


根据此FastMM4错误,如果您释放另一个对象中的对象,您也会自动释放所有者。我知道这不可能是真的,但如果我错了,请纠正我。

2 个答案:

答案 0 :(得分:5)

TSignal是否在其析构函数中释放了其AlarmList成员? (这就是我要这样做的方式)。

更新:如果您删除TSignal(SignalList.Items[x]).AlarmList.Free;行,它会有效吗?

第二次更新: 如果包含指向对象的指针,则需要释放每个TList

您的问题是TSignal TList。由于它负责释放其成员(例如Alarmlist),因此不应该明确释放该Alarmlist。

答案 1 :(得分:2)

由于TAlam和TSignal都是对象(不是记录),我相信你应该使用TObjectList而不是TList。 TObjectList有一个特殊的属性calld OwnsObjects,它允许它在释放时正确释放它的内容。看看http://docwiki.embarcadero.com/VCL/XE/en/Contnrs.TObjectList.OwnsObjects

作为建议,除非你需要存储指针而不是对象,否则不要使用TList。