首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除TList中的TList

删除TList中的TList
EN

Stack Overflow用户
提问于 2011-03-25 14:13:32
回答 2查看 663关注 0票数 0

在onDestroy事件中,我试图释放Tlist中的Tlist,而FastMM4正在引发访问冲突错误。这是代码片段。

代码语言:javascript
复制
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错误,如果您释放另一个对象中的一个对象,也会自动释放所有者。我知道这不可能是真的,但如果我错了,请纠正我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-25 14:23:56

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

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

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

你的问题是TSignal不是TList。由于它负责释放其成员(例如Alarmlist),所以不应该显式地释放Alarmlist。

票数 5
EN

Stack Overflow用户

发布于 2011-03-25 14:31:03

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5433603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档