我正在尝试在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错误,如果您释放另一个对象中的对象,您也会自动释放所有者。我知道这不可能是真的,但如果我错了,请纠正我。
答案 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。