致命错误C0000005
lj_lt 2007-07-15 09:41:56 希望这段在网上找到的文章 , 对你有点帮助 ...
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”的信息框中,您会收到似乎更详细些的信息,指示您程序出错的地方。那通常是包含在SCX、SCT或VCX、VCT里某些行的代码。
千万不要被误导,幷不是您的程序代码编写有问题,而是隐藏在标识符之外的、看起来好像是空格、回车的空白段,那里隐藏了低级链接的错误、或Unicode的错位排序(下面马上就会讲述到),用Shift+箭头键将整行全选,然后按Delete键除之,最后老老实实地将原行代码重新书写一遍即可(切记:用Shift+箭头键将整行全选,然后将该整行彻底清除)。
2、Unicode
从Windows98升级过来的VFP程序员似乎都曾有过这样的困惑:爲什Windows2000以上版本的VFP程序會如此的不穩定,以至于頻繁出現“致命錯誤——C0000005”?
Visual Foxpro的词法扫描仪大概是这样工作的:词法扫描仪分析代码本的时候,先要判断一下 下一个被扫描的Token是否为空标记。若是,则看该空标记是Tab标记还是回车标记,或者是分隔符或其它的占位符;若不是,则判断该Token是单字节还是双字节字符,这种机制在基于Unicode的Windows版本中,有时会遇到标识符号的错位。
您现在上网用的计算器的操作系统是WIN2000或WinXP吗?如果是,不妨亲自做这样一个试验:
打開記事本程序,輸入“聯通”,然後保存後關閉該文本,再重新開打,看到什了?标识符号被错位了!
是的,当年WIN2000操作系统的流行时,Visual Foxpro开发组幷没有彻底改正语义分析器代码的漏洞。
好的,第一大类我就阐述完了。如何避免它呢?
总的应该说很麻烦,有两种途径供您选择:
1、修改VCX、SCX表国际代码页的编码,将简体中文编码改为英文编码;
2、我所推荐的方法是尽量用prg。你可能会认为这样做很麻烦,但作为程序员,您应该更加专业一些。您可以备份可视化的窗体或类文件,但在程序正式发布前,最好最大限度地转化为prg程序。倘若以后需要修改程序,通过备份的窗体或类文件进行可视化编辑,然后再次转化为prg发布之。
对于已经开发好的项目,就没有必要大兴土木地全部将Vcx、Scx转化为Prg了,但您应该着重关注一下主菜单Mnx文件,及控件(尤其是图片)特别多的窗体。或许,您曾遇到过这样令人匪夷所思的问题:在運行exe文件時,爲什有時候一切正常,而有時候産生致命异常——要知道開發人員根本就沒改任何的代碼呀?