EAccessViolation异常!!! (详细,有图像)

时间:2015-04-24 20:23:49

标签: delphi memory-management memory-leaks

好吧,我再来一次,试图解决一个老问题。

简单地说,当我尝试释放一个没有任何所有者的模态表格时,我得到了一个AV,并且之前没有被释放。

MouseEvent

如果我只是激活然后关闭(不做任何事情),则不会发生AV。在“免费”之前设置一个断点。如果我将鼠标光标放在表单上,​​它会向我显示表单中的变量。

但是如果我在网格中插入一个项目,在同一个地方使用断点,当我将光标移动到同一行时,它不会再显示变量,而是表示“不可用的值”'。

如果我继续运行代码,因为下一行有“免费”#39;命令我得到一个AV。 是什么让我相信在该程序中有一段代码正在为代码做一些意想不到的事情,但我可以告诉你,没有' free'或类似命令到那里有问题的表格。

我的解决方案(临时)只是评论' .free'命令,但是如果我运行MadException,当我关闭应用程序时会出现内存泄漏(嘿,现在任何东西都比这个EAccessViolation更好了。)
任何sugestions?

2 个答案:

答案 0 :(得分:1)

好的,最后找到了答案。 问题是全局数组。 它被宣布为 vm1 : array[1..100] of currency;
但它在位置0处被分配了一个值 令我绝望的是,在分配变量时没有错误,就在我试图释放表单时。 当你找到它时如此简单..(!!!) 好吧,至少我弄清楚了。谢谢大家的支持!

答案 1 :(得分:0)

  

OP:frmItensVenda是一个自动创建的全局变量(但未初始化)。

我看到你做frmItensVenda := TfrmItensVenda.Create(nil);

在.dpr文件中查找Application.CreateForm(TfrmItensVenda, frmItensVenda); 如果它在那里你创建一个新实例!

{$R *.RES}

begin
  Application.Initialize;
  Application.Title := 'AServer';
  ...
  Application.CreateForm(TfrmItensVenda, frmItensVenda);
  ...
  Application.Run;
end.

是的,动态表单管理确实是必须(特别是在大型应用程序中)。

遇到大Forms的问题,我的部分解决方案是尽可能地创建动态。
只有在需要它们之后才能将它们直接释放出来。

  frmItensVenda := TfrmItensVenda.Create(nil);
  frmItensVenda.ShowModal;
  OP:我的解决方案(临时)只是评论' .free'命令,

不要这样做:改为使用

  frmItensVenda.Release;

"方法发布"删除表单并释放其相关的内存。

发布程序;

描述

使用发布时,您可以从内存中删除表单。

Release是在表单的事件处理程序及其子组件的执行完成之后要采取的形式。

在任何情况下,都应免费使用处理程序版本以避免访问冲突。

您需要使用Release的情况是您处于事件处理程序中间的时间(例如,OnClick),事件之后的进一步处理将必须访问该表单。

在这种情况下,调用Release会发布一条WM_RELEASE消息,该消息不会释放事件,直到事件处理程序完成并且控制权已返回到消息泵(ProcessMessages / Application.Run)。

虽然阅读delphi帮助,但建议您使用release命令。

对于Release v.s Free方法。我的理解是"发布"特定于表单,并允许与表单相关的偶处理程序在释放资源之前完成。

然而"免费"是一种从内存中释放对象的通用方法(因此也应该使用表单。)