0

我正在尝试在 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]).Free 处收到访问冲突错误;线。在释放 SignalList 项目之前释放 AlarmList 项目会引发访问冲突错误,但为什么?

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


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

释放对象类:TList

虚法:销毁

虚拟方法地址:427CF0

分配编号为:80055

其次是大量的内存转储。


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

4

2 回答 2

5

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

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

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

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

于 2011-03-25T14:23:56.393 回答
2

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

建议不要使用 TList ,除非您需要存储指针而不是对象。

于 2011-03-25T14:31:03.083 回答