在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.itemsx).Free;line中,我得到了访问冲突错误。在释放AlarmList项之前释放SignalList项会引发访问冲突错误,但为什么?
更新:我在Windows上使用Delphi7.0。实际的FastMM4消息如下所示。
FastMM检测到有人试图在已释放的对象上调用虚拟方法。现在将引发访问viloation,以便中止当前操作。
已释放的对象类: TList
虚拟方法:毁灭
虚拟方法地址:427CF0
分配号码是: 80055。
然后是大量的内存转储。
根据这个FastMM4错误,如果您释放另一个对象中的一个对象,也会自动释放所有者。我知道这不可能是真的,但如果我错了,请纠正我。
发布于 2011-03-25 14:23:56
TSignal没有释放其析构函数中的AlarmList成员吗?(我就是这样做的)。
更新:如果您删除TSignal(SignalList.Items[x]).AlarmList.Free;行,它会工作吗?
第二次更新:如果每个TList的items包含指向对象的指针,则需要释放它。
你的问题是TSignal不是TList。由于它负责释放其成员(例如Alarmlist),所以不应该显式地释放Alarmlist。
发布于 2011-03-25 14:31:03
由于TAlam和TSignal都是对象(而不是记录),所以我认为您应该使用TObjectList而不是TList。TObjectList有一个特殊的属性calld OwnsObjects,允许它在被释放时正确释放其内容。看看这个http://docwiki.embarcadero.com/VCL/XE/en/Contnrs.TObjectList.OwnsObjects
作为建议,除非您需要存储指针而不是对象,否则不要使用TList。
https://stackoverflow.com/questions/5433603
复制相似问题