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分配的内存已经被释放,导致了程序中断。在项目中,采用了递归的算法进行了多次的搜索,在函数进行退出递归的时候,该指针已经指向了一个已经释放的内存,所在在进行递归的过程中,将已有的内容拷贝出来,防止在递归的过程中被释放,从而解决了问题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。