Delphi EAccessViolation异常!!!(详细,附图片)

Delphi EAccessViolation异常!!!(详细,附图片),delphi,memory-management,memory-leaks,Delphi,Memory Management,Memory Leaks,嗯,我又来了,试图解决一个老问题 简单地说,当我试图释放一个没有任何所有者的模态表单时,我得到了一个AV,并且以前没有被释放过 frmItensVenda := TfrmItensVenda.Create(nil); frmItensVenda.vtipo := vtipo; frmItensVenda.vcontrole := strtoint(edit1.Text); frmItensVenda.

嗯,我又来了,试图解决一个老问题

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

frmItensVenda := TfrmItensVenda.Create(nil);
                frmItensVenda.vtipo := vtipo;
                frmItensVenda.vcontrole := strtoint(edit1.Text);
                frmItensVenda.Ednota.Text := Edit5.Text;
                frmitensvenda.lbvend.Caption := combobox3.Text;
                frmitensvenda.lbnome.Caption := combobox1x.Text;
                frmItensVenda.limite := limite;
                if label10.caption <> '' then
                    frmItensVenda.vcli := strtoint(label10.caption);
                frmItensVenda.ShowModal;
                Frmitensvenda.Close;
                frmItensVenda.Free;
frmItensVenda:=TfrmItensVenda.Create(nil);
frmItensVenda.vtipo:=vtipo;
frmItensVenda.vcontrolle:=stroint(edit1.Text);
frmItensVenda.Ednota.Text:=Edit5.Text;
frmitensvenda.lbvend.Caption:=combobox3.Text;
frmitensvenda.lbnome.Caption:=combobox1x.Text;
frmItensVenda.limite:=limite;
如果label10.caption为“”,则
frmItensVenda.vcli:=stroint(标签10.标题);
frmItensVenda.ShowModal;
Frmitensvenda.关闭;
免费;
如果我只是激活它,然后关闭(不做任何事情),没有AV发生。将断点放在“free”命令之前,如果我将鼠标光标放在窗体上,它将显示窗体内的变量

但是,如果我在网格中插入一个项目,在相同的位置使用断点,当我将光标移动到同一行时,它不再显示变量,而是显示“不可访问的值”

如果我继续运行代码,因为下一行有“free”命令,我会得到一个AV。 是什么让我相信这个过程中有一段代码在做一些代码没有预料到的事情,但是我可以告诉你,这里没有“free”或类似于表单的命令

我的解决方案(临时)是只对“.free”命令进行注释,但如果我运行MadException,我在关闭应用程序时会出现内存泄漏(嘿,现在对我来说,有什么比这更好的方法吗?
有什么建议吗

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

我看到您执行
frmItensVenda:=TfrmItensVenda.Create(nil)

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

{$R *.RES}

begin
  Application.Initialize;
  Application.Title := 'AServer';
  ...
  Application.CreateForm(TfrmItensVenda, frmItensVenda);
  ...
  Application.Run;
end.
是的,动态表单管理确实是一项必须的工作(特别是在大型应用程序中)

在大型
表单出现问题时,我的部分解决方案是尽可能多地创建动态表单。
只有在需要的时候,然后立即释放它们


OP:我的解决方案(临时)是只注释“.free”命令

不要这样做:改用

  frmItensVenda.Release;
“方法释放”删除表单并释放其相关内存

释放程序

描述

使用release,您可以从内存中删除表单

Release是在表单及其子组件的事件处理程序执行完成之前要执行的表单

在所有事件处理程序中,应使用“免费”版本,以避免访问冲突。

需要使用发布的情况是在事件处理程序(例如OnClick)中间的时间,事件之后的进一步处理将必须访问该窗体。 在这种情况下,调用Release会发布一条WM_Release消息,该消息在事件处理程序完成并且控件返回到消息泵(ProcessMessages/Application.Run)之前不会释放事件

阅读delphi帮助时,建议您使用release命令。

至于释放v.s Free方法。我的理解是“释放”是特定于表单的,并且允许表单相关的处理程序在释放资源之前完成


而“Free”是一种从内存中释放对象的通用方法(因此也适用于窗体)。

好的,最后找到了答案。 问题是全局数组。 它被宣布为
vm1:currency的数组[1..100]
但在位置
0

令我失望的是,当我试图释放表单时,变量被赋值时没有错误。 当你找到它的时候,它是如此的简单。。(!!!)
至少我知道了。谢谢大家的支持

我认为你应该把问题降到最低限度,然后发布代码。然后我们可以提供帮助。你应该做的另一件事是开始使用try-and-finally来防止泄漏。Ken在前面问题中的示例代码显示了如何做到这一点。我正在编辑图像,目的是显示在第一种情况下,我可以看到frmitensvenda中的变量,而在第二种情况下,它是不可访问的,但是我想你是对的,表单的OnClose是否可能将Action设置为caFree?你的代码的图像完全没有用处。它们不仅难以读取(尤其是从移动设备读取),而且代码也无法复制并粘贴到编辑器中进行测试。如果你想“做重要的事”,就把你的实际代码以正确格式的文本形式发布出来。从IDE复制它,将它粘贴到问题中,选择它,然后使用Ctrl+K(或工具栏上的
{}
按钮)将其格式化为代码。绝对没有你发布的图片对你在这里提出的问题是必要的或有用的。你忽略了“重要的”而选择了毫无价值的图片。有趣的想法。我已经读过,如果你想通过表单本身内部的命令释放表单,应该使用release,但是如果一直使用它来释放表单,可能会更安全…@CristianTrein:试试看,你是否得到了一个
不可访问的值
?free在所示的用法中是正确的。释放是不可能的。@DavidHeffernan你能解释一下为什么吗?我明白了我不能免费使用的地方,但使用release的缺点是什么?谢谢调试时,请使用范围检查。
  frmItensVenda.Release;