我最近从XE4升级到XE8,并在将itemindex分配给无线电组时遇到了访问冲突。我很好奇为什么在XE4中它起作用而XE8它没有。所有表单都是在主程序启动时创建的。此代码在调试时工作正常,但在独立运行时会抛出异常。
with TravelBookingForm do begin
try
rg1.itemindex:=tag-1;//not sure which causes the access violation
except
on E : Exception do
begin
showMessage(E.Message); //access violation message is shown
end;
rg1.tag := 0;
end;
end;
注意:我省略了不相关的代码
答案 0 :(得分:2)
因此,经过更多测试,我可以确认rg1不是nil,并且它是导致访问冲突的项目。
如果rg1
不是nil
但却导致访问冲突,那么最合理的解释是rg1
指向已释放的内存。这与有时发生错误(在调试器外部)而不是其他错误(在调试器下)的观察相匹配。
所以,你的程序在某个时候破坏了表单,然后再引用表单。
显然,这是程序中的错误,您需要确保在销毁之后永远不会引用表单。不幸的是,IDE鼓励您在启动时创建所有表单,并在全局变量中保存引用。这使得过时的引用太容易了。
如果您使用了FastMM的完整调试版本,那么当您尝试访问已释放的内存时,该工具将能够发出警告。