2

我最近从 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;

注意:我省略了不相关的代码

4

1 回答 1

2

因此,经过更多测试后,我可以确认 rg1 不是 nil 并且它是导致访问冲突的项目。

如果rg1不是nil并且仍然导致访问冲突,那么最合理的解释是rg1指向已释放的内存。这与错误有时发生(在调试器外部)而不是其他情况(在调试器下)的观察结果相符。

因此,您的程序在某个时候破坏了表单,然后再引用该表单。

显然这是您的程序中的一个错误,您需要确保在表单被销毁后​​您永远不会引用它们。不幸的是,IDE 鼓励您在启动时创建所有表单,并在全局变量中保存引用。这使得拥有过时的引用变得太容易了。

如果您使用了 FastMM 的完整调试版本,那么该工具将能够在您尝试访问已释放的内存时向您发出警告。

于 2015-05-07T08:54:28.990 回答