阅读this之后,我想知道下一个代码是什么问题:


procedure TForm1.Button5Click(Sender: TObject);
begin
  Button5.free;
end;

最佳答案

在该例程上放置一个断点,然后检查调用堆栈。从事件处理程序返回后,仍然有来自Button5的代码正在运行,而其他VCL代码则希望Button5仍然存在。如果从对象下面删除对象,则很有可能最终以某种方式破坏内存或引发异常。

如果要执行此操作,正确的方法是调用PostMessage并将消息发布到表单,该表单最终将在当前代码完成运行后安全地释放对象。

07-28 01:32