2011-03-25 41 views
0

我想在onDestroy事件中的Tlist中释放Tlist,并且FastMM4正在引发访问冲突错误。这是代码片段。删除TList中的TList

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检测到尝试在释放的对象上调用虚拟方法。现在将提出访问视图以中止当前操作。

已释放对象类:从TList

虚拟方法:消灭

虚方法地址:427CF0

分配数为:80055

随之而来的是大量的内存转储。


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

+0

您使用的是什么版本的Delphi? – 2011-03-25 14:26:39

+2

“FastMM4正在引发访问冲突错误”和“我得到访问冲突错误”不提供任何信息。什么是确切的错误信息(包括任何内存地址)?尽管我们可以猜到它们是什么,但当我们不必这样做时,你会得到更好更快的答案。另外,正如@ M.Sameer所说,知道哪个Delphi版本可以提供帮助。 – 2011-03-25 14:30:16

+0

TSignal和TAlarm构造函数/析构函数的代码也可以提供帮助,以及用于向/从信号添加/删除警报的任何代码。 – 2011-03-25 15:47:17

回答

5

请问TSignal没有在其析构函数中释放它的AlarmList成员? (这就是我会这样做的)。

更新:它是否工作,如果您删除TSignal(SignalList.Items[x]).AlarmList.Free;行?

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

你的问题是,TSignal一个TList。由于它需要释放它的成员(例如Alarmlist),所以不应该明确地释放Alarmlist。

+0

它确实但不包含alarmlist指针指向的对象。 – ThN 2011-03-25 15:31:57

+0

是的,但是当您尝试释放TSignal时,它会尝试释放您已经释放的Alarmlist成员。我怀疑FastMM在抱怨。警报器所包含的内容是无关紧要的。 – Martijn 2011-03-25 15:37:37

+0

是的。只要我没有专门从Signalist中释放Alarmlist成员,它就可以正常工作。但我认为你总是需要释放TList的成员,否则会泄漏内存。 – ThN 2011-03-25 15:44:33

2

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

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

+0

@Sameer,SignalList和AlarmList存储指针。这就是为什么当我需要访问一个对象时,我必须这样做。例如,TSignal(SignalList.items [x])。name。 – ThN 2011-03-25 15:17:33

+1

TObjectList是TList后代,它是管理列表的TList代码。所以实际上TObjectList也存储指针。它只是为你执行从/到Pointer和TObject的投射(并提供OwnsObjects,因此你不必释放它的指针列表指向的实例)。 – 2011-03-25 15:45:35