运行程序提示access violation at address的解决方法解决您的问题( 二 )


(5) 检查一下计算机里是否有没用的东西和程序冲突 。 奇怪的软件程序和测试版的产品常常会导致Access Violation错误 。
【运行程序提示access violation at address的解决方法解决您的问题】(6) 如果系统设置有错误 , 那么Access Violation错误可能也会经常出现 。 如果你不停地遇到一个错误提示信息一样的Access Violation , 记录下这些细节 , 然后通知可能导致这个错误的软件制造厂商 。
这些就是我对设计期Access Violation错误的全部建议 。
二、运行期的Access Violation
Delphi常见的运行期Access Violation错误有哪些?如何防止?
任何软件开发都会遇到这样的情况:你写好程序并测试 , 然后到处发送 , 结果用户告诉你它失败了 。
你可能考虑用编译指令{$D}编译你的程序——Delphi可以建立一个有助于定位Access Violation错误的源代码的镜像文件 。 工程选项对话框(ProjectOptionsLinker Compiler)让你指定你所需要的一切 。 对于单元文件 , debug信息和单元的对象代码一起记录在unit文件里了 。 编译使用这个单元的程序时 , debug信息会增加单元文件的大小而且会增加额外的内存开销 , 但是它不会影响最终可执行文件的大小和运行速度 。 包含debug信息和镜像文件(ProjectOptionsLinker)选项的产品只有在{$D+} 编译指令下才会完成行信息 。
Access violation通常只在程序的某一个方面表现出来 。 当问题第一次出现时 , 考虑一下用户进行了什么操作是很重要的 , 然后从这里寻找突破口 。 从用户的角度来看 , 你的程序中止了他们的工作 , 由他们来告诉你出现的问题似乎让你延期解决这个问题了 。 然而 , 与用户交流是你发现问题和改善程序的惟一有效方法 。
现在你将可以知道在只给你冲突地址的情况下 , 如何轻松发现准确路径、源代码文件、发生Access violation错误的行:
“Search - Find Error…” 。
当一个运行期Access violation出现时 , 你的用户得到的错误信息类似于如下情况:
Access violation at address <十六进制值>
in module <应用程序名>
Read of address <十六进制值>
如果你的程序在Delphi IDE里包含debug信息编译 , 你可以定位到导致这个错误源代码这一行 。
在Delphi程序中 , 一个最普遍导致Access Violation错误的原因是使用了一个没有被创建的对象 。 如果第二个地址<十六进制值>是FFFFFFF或0000000 , 十有八九就是你访问? 了一个没有被建立的对象 。 例如 , 你调用了一个表单的事件 , 但这个表单不是自动创建的 , 也没有代码实例化 。
?procedure TfrMain.OnCreate(Sender: TObject);
var BadForm: TBadForm;
begin
//这里将会产生Access violation
BadForm.Refresh;
end;
假设BadForm在工程选项“Available Forms”窗口列表里——这个窗口是需要手工创建和释放的 。 在上面的代码里调用BadForm窗口的Refresh方法就会导致Access violation 。
如果你在Debugger选项窗口使“Stop on Delphi Exceptions”生效 , 那么就会弹出下面的信息:
The message states that the EAccessViolation has occurred. The EAccessViolation is the exception class for invalid memory access errors.
这是你在设计程序时将会看到的信息 , 下一个信息框将会出现 , 然后程序失败了:
Access violation at address 0043F193
in module ’Project1.exe’
Read of address 000000.
第一个十六进制数0043F193是发生Access violation的编译代码(Project1.exe)的运行期错误的地址 。 在IDE里选择菜单项“SearchFind Error…” , 在对话框里输入错误发生的地址(0043F193)后点击“OK”按钮 。 Delphi将会重新编译你的工程文件 , 然后显示发生运行期错误的那一行代码 , 这里就是BadForm.Refresh这一行了 。
下面列出了Delphi环境下导致Access violation错误的大部分常见原因 。 这个列表不是也不可能覆盖所有可能出现的Access violation的情况 。 请在论坛上发送你的Access violation信息 , 大家可以试着一起解决这个问题——真正的实际事例一般情况下比列出来的错误隐晦得多 。
1. 调用一个不存在的对象
如上所述 , 大部分Access violation的合理原因是使用了没有被创建或者已经被释放的对象 。 为了防止这种类型的Access violation的发生 , 请确保你访问的任何对象都首先被创建了 。 例如 , 当一个Table定位在一个没有被创建的data module(从auto-crete窗口里移走了)里 , 你可能在窗体的OnCreate事件里打开这个表 。

推荐阅读