TObjectList.Clear访问冲突

时间:2011-02-18 16:13:04

标签: delphi

我遇到了一个很大的应用程序非常奇怪的问题。我大量使用TObjectList存储自定义对象。在大型列表中,当我使用CLEAR方法时,我遇到了“地址访问冲突,地址读取......”,“特权指令”等奇怪的崩溃。在尝试删除列表中的最后一项时,我已经跟踪到这一点。我已经通过从破坏过程中记录包含的对象删除来检查这一点,并且还尝试自己删除它们(对于:= olist.count-1 downto 0 do .. debugmsg('deleted'+ inttostr(a) ).. olist.delete(a)),这两种方式都是在删除列表中剩余的剩余项目时获得访问权限的权利。

这并不总是发生,因为我在其他领域使用clear,以及一些不同的(较小的)列表,但在我的应用程序中的一个非常具体的点发生这种情况。

我不知道可能出现什么问题,在清除过程中没有什么可以尝试访问列表,并且被硬币化的对象无法访问其父对象列表,在TObjectList.delete /中必须有一些东西搞砸了清除最后一项时的明确方法。

有什么建议吗?使用Delphi XE。

2 个答案:

答案 0 :(得分:18)

听起来像你正在释放已经被释放的物体。要对此进行跟踪download the full version of FastMM,请将FullDebugMode添加到项目选项 - > Delphi编译器下的条件定义行和链接设置为详细信息下的地图文件选项,然后重建。 (构建,而不是编译。)然后将FullDebugMode DLL复制到与EXE相同的文件夹并运行它。它会在您分配和释放时观察您的内存,当您尝试第二次释放相同的对象时,它会捕获并提供一些非常详细的调试数据,以确定问题的来源。

答案 1 :(得分:1)

您确定最后一个对象是否有效且尚未删除?它可能在列表中两次,例如由于其他错误。