我遇到了一个很大的应用程序非常奇怪的问题.我大量使用TObjectList存储自定义对象.在大型列表中,当我使用CLEAR方法时,我遇到了“地址访问冲突,地址读取……”,“特权指令”等奇怪的崩溃.在尝试删除列表中的最后一项时,我已经跟踪到这一点.我已经通过从其破坏proc中记录包含的对象删除来检查这一点,并且还尝试自己删除它们(对于:= olist.count-1 downto 0 do .. debugmsg(‘deleted’inttostr(a)) .. olist.delete(a)),这两种方式都是在删除列表中剩余的剩余项目时获得访问权限的权利.
这并不总是发生,因为我在其他区域使用clear,还有一些不同的(较小的)列表,但在我的应用程序中的一个非常特定的位置会发生这种情况.
我不知道可能出现什么问题,在清除过程中没有任何东西试图访问列表,并且被硬币化的对象无法访问其父对象列表,在TObjectList.delete / clear方法中必须有一些东西搞砸了.它来清除最后一项.
有什么建议?使用Delphi XE.
解决方法
这听起来像你正在释放已经被释放的物体.要跟踪此情况,请在
download the full version of FastMM中将FullDebugMode添加到项目选项 – > Delphi编译器下的条件定义行和链接设置为详细信息下的地图文件选项,然后重建. (构建,而不是编译.)然后将FullDebugMode DLL复制到与EXE相同的文件夹并运行它.它会在您分配和释放时观察您的内存,当您尝试第二次释放同一个对象时,它会抓住它并为您提供一些非常详细的调试数据,以确定问题的来源.