TObjectList.Clear访问冲突
我遇到了一个很大的应用程序很奇怪的问题。我大量使用TObjectList来存储自定义对象。在大型列表中,当我使用CLEAR方法时,我遇到了“访问冲突地址..读取地址..”,“特权指令”等等的奇怪崩溃。我试图删除列表中的最后一个项目时,我已经跟踪到了这一点。我已经通过记录从它们的销毁过程中删除了包含的对象删除了它,并试图自行删除它们(对于:= olist.count-1 downto 0 do .. debugmsg('deleted'+ inttostr(a) ).. olist.delete(a)),这两种方式在删除列表中最后一个剩余项目时都会遇到访问冲突。TObjectList.Clear访问冲突
这并不总是发生,因为我在其他领域使用清除,还有一些不同的(小)列表,但在我的应用程序中的一个非常特定的时刻发生这种情况。
我不知道什么可能是错误的,没有什么事情在清除期间试图访问列表,并且cointained的对象无法访问其父对象列表,必须在TObjectList.delete中搞一些东西/清除最后一项的方法。
有什么建议吗?使用Delphi XE。
对我来说这听起来像是你释放已被释放的物体。为了跟踪这个,download the full version of FastMM,将FullDebugMode
添加到Project Options-> Delphi Compiler下的Conditional Defines行,并将Linking set设置为Detailed,然后重建下的Map File选项。 (生成,不编译)。然后将FullDebugMode DLL复制到EXE所在的文件夹并运行它。它会在您分配和释放时监视您的记忆,当您尝试第二次释放同一个对象时,它会捕获并为您提供一些非常详细的调试数据,以确定问题来自哪里。
您确定最后一个对象有效且尚未删除吗?它可以在列表中两次,例如由于其他错误。
看起来像在其他地方发生的内存损坏,你只能看到回声。 – 2011-02-18 16:22:07
TObjectList具有“OwnsObjects”属性。是真是假?你使用TObjectList的代码实际上是什么样的? – 2011-02-18 19:21:15