VS 0xC0000005 运行错误分析 |
您所在的位置:网站首页 › vs运行有未经处理的异常 › VS 0xC0000005 运行错误分析 |
0xC0000005: 读取位置 0x22203A22 时发生访问冲突 场景 网络传输过来的,由于采用了qpid-cpp库,获取到的是request.getContent()的是string类型的数据类型,然后通过c_str函数,获取到字符串,保存在一个char szBuffer[1024]数组内,在定义的类,调用析构函数退出导致程序崩溃 原因 通过strcpy拷贝字符串到szBuffer数组,发生了数组的越界,因为字符串的长度是1159 提醒 目前已经出现过两次的0xC0000005崩溃信息 1 访问一个释放的空指针,在一个递归的逻辑中 2 strcpy拷贝字符串,发生数组越界 xC0000005:读取位置oxfeeefeee时发生访问冲突 问题 test.exe 中的 0x1021af50 (zlib.dll) 处未处理的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突
分析 代码中断于获取list的迭代指针: #if _HAS_ITERATOR_DEBUGGING || _SECURE_SCL iterator begin() {// return iterator for beginning of mutable sequence return (iterator(_Nextnode(_Myhead), this)); } 怀疑1:是否是堆栈溢出?不可能没有占用多少空间 怀疑2:是否迭代书写问题?不可能在其他的程序运行良好 现象:调用堆栈的显示区域,提示:feeefeee() 进行debug设置:调试菜单下,勾选所有的异常,在调试的模式下,重新编译。这一次指向list迭代之前的一行代码,这行代码进行了字符串的拷贝,观察赋值指针,pszName的值是0xfeeefeee:错误的指针。 补充知识 FEEEFEEE微软的HeapFree函数用该值来标记被释放了的堆内存 经过上面的知识,可以知道任何的一块内存分配,都会在字符串中填充0xfeeefeee作为内存没有释放的标志,当调用函数释放内存的时候,就会首先检查指针的内容是否包含该标志位,如果没有该标志位,就会出现异常中断的情况。pszName分配的内存已经被释放,导致了程序中断。在项目中,采用了递归的算法进行了多次的搜索,在函数进行退出递归的时候,该指针已经指向了一个已经释放的内存,所在在进行递归的过程中,将已有的内容拷贝出来,防止在递归的过程中被释放,从而解决了问题。 本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1959204,如需转载请自行联系原作者 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |