本以偷懒的态度草草回复之,然而接下来网友的追问使我自知偷懒的后者便是语义表达不到位,便索性连夜写下此主题帖。但仍以简练为主,请大家多担待!
在文章中,若一整段的文字均被括入括号中,则说明它不过是与主题无关的小常识。
c0000005错误发生的诱因主要分为四大类:
1、自由表存储载体的缺陷(主要体现在VCX、VCT,SCX和SCT上)。
2、第三方监控性质的软件。(如:防毒软件在内存即时监控状态下、词霸软件在全屏拾取模式下等);
3、Visual Foxpro 自身的代码漏洞;
4、硬件因素。
先说第一大类:
同数据表一样,在Visual Foxro 9.0 版本中,自由表也支持了原子事务机制,这并非主要是为了满足客户的需要,而以稳定VFP9自身为主。我们都知道类与表单的代码多以物理形式为自由表的VCX、VCT,SCX和SCT文件格式存储,在IDE设计模式下,代码被VFP后台以独占的、开放式自由表缓冲的模式存取。然而您应该敏感地注意到:自由表是不支持事务机制的(低于9.0版本的Visual Foxro)。也就是说,遇到停电或操作系统异常时,它们同样会面临表头损坏、低级链接错误、记录指针错误偏移的风险。Microsoft Visual Foxpro 开发组没有将VCX、SCX设计为依赖于数据库的数据表的形式,原因不难理解——如果一个表单文件中,包括表单本身在内的任何一个控件都不依赖于用户自定义派生类的话,那么该文件应该可以被独立地拷贝与打开。
如下的常识我们都需要知道:
无论是在设计模式还是在运行模式下,Visual Foxpro的Runtime会随时将客户脚本读取到内存体中,并交由词法分析器、语法分析器和语义分析器来分析、解释、处理这些代码。
(通常情况,在编辑模式下,我们的脚本代码已经被Visual Foxpro词法分析器进行了第一遍的过滤;在编辑完一个prg或表单或类文件后,若按下Ctrl+W组合键将在保存它之前调用语法分析器来试图检查其中的错误(注意“词法”分析器与“语法”分析器的不同),然后程序界面将自动被关闭;而若按下Ctrl+S组合键保存后,再手动退出时,这种情况下将不会调用语法分析程序。)
如果你的脚本保存在自由表形式的SCX、SCT、VCX、VCT文件中,Visual Foxpro会通过表的记录指针提取对应备注文件里的程序脚本(那里或许包含了某些事件或方法的代码),Visual Foxpro会通过调用C语言的sizeof()来判断字节的长度,根据长度提取字节,最后将长度的返回值与实际代码以参数的形式传递给语义分析器来解释执行。然而在一些情况下,会发生sizeof()判断的字节长度与实际的长度不一致的情况。
倘若sizeof(
)判断的字节长度与实际的长度不一致,将会发生内存的溢出,这个致命错误被Visual Foxpro异常处理器捕获后,将抛出“致命错误-C0000005”的信息。
“致命错误”是字符常量,“c0000005”是一个变量,c0000005不是VFP的错误编码,而是得到Windows消息环所传递过来的错误消息的半加工品。它的原始状态是16进制的0xC0000005,VFP通过相关的转换函数转换成字符串的形式,以便通过界面描述给用户。
那么什么情况下会出现sizeof()判断的字节长度与实际的长度不一致的情况呢?主要有两方面的主导因素。
1、我们前面铺垫过了,VCX、VCT,SCX和SCT文件都是自由表,都有可能在
设计时被无意的损坏。
倘若表头被损坏,您会在试图打开它们的时候收到VFP系统的无法打开该表单的信息;但倘若低级链接错误、记录指针错误偏移,您就不会得到任何VFP的提示,因为VFP系统自己也不知道这一点,就像您一样。于是直到程序运行时,才会收到令人惊愕的致命错误信息——语义分析器工作时内存被溢出。
在一些“致命错误-C0000005”的信息框中,您会收到似乎更详细些的信息,指示您程