灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:4148回复:0

什么是访问冲突(AccessViolations),如何排除该类错误

楼主#
更多 发布于:2012-09-08 13:06

无论何时碰到的访问冲突都意味着你的程序试图访问不能再为你的程序所获得的内存。请注意我用了“不再(No Longer)“获得。在很多场合中遇到访问冲突都是因为试图已经释放的对象的指针或者尚未创建的对象的指针。

幸运的是,Win32的内存结构中,每个进程拥有独立的地址空间,因此我们不必担心覆盖其他程序的内存(这个在Win16种是经常遇到的问题)。这也说明了我们如今(actually)可以利用错误对话框中的信息。

当我们碰到访问冲突对话框时,都会有个地址(例如:Access violation at address:?????)。记下这个地址,返回到应用程序中,打开cpu窗口,在CPU窗口中右击鼠标选择Goto address。当对话框出现的时候,输入刚才访问冲突发生的地方,你就到了引起访问冲突的指令。

尽管CPU窗口中所有的都是用汇编语言写的,这并不对你很重要。如果你把滚动条向上滚一点,就可以看到你当前所处的函数。现在,你就知道是哪个函数引起了访问冲突。一旦你知道引起访问冲突的函数,就可以着手在这个函数中设立断点。

不幸的是,不是所有的事情都那么容易,指针错误有时候非常难查找,总的规则是当指针所指向的对象被释放的时候,把这些指针都设置为NULL,你也许还想在厌恶的函数中使用指针前检查它是否为NULL,如果为NULL你可以输出一些排错信息来帮助你查明哪个指针在程序运行时引起了访问错误。

作为最后的手段,你需要能够在那个指针处设立数据断点(data break point) 来检查它何时设为NULL

喜欢0 评分0
游客

返回顶部