删除TList中的TList

ThN*_*ThN 0 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;
Run Code Online (Sandbox Code Playgroud)

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

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


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

Freed Object类:TList

虚方法:破坏

虚方法地址:427CF0

分配编号为:80055

接着是大量的内存转储.


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

Mar*_*ijn 5

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

更新:如果删除该TSignal(SignalList.Items[x]).AlarmList.Free;行,它会起作用吗?

第二次更新:每个TList项目需要释放,如果它包含对象的指针.

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