从 XE8 中的 Form 标签分配给 RadioGroup 标签导致访问冲突

Assigning to RadioGroup Tag from Form Tag in XE8 causes access violation

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

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

So after more testing I can confirm that rg1 is not nil and that it is the item causing the access violation.

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

所以,您的程序在某个时候破坏了表单,然后又引用了表单。

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

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