问题描述
C/C++程序运行时提示“读取/写入位置发生访问冲突”。例如:0x00007FFF33515D43 (swscale-4.dll) (QTDemo0.exe 中)处的第一机会异常: 0xC0000005: 读取位置 0x0000000000000040 时发生访问冲突。
如图所示:
产生原因
一般都是由于发生异常处的代码中,涉及到数据的读取或写入,并且访问数据时使用的是指针,而该指针并未得到合适的初始化,导致其所指向内存为NULL。
解决方法
首先,找到出错的代码位置,这可以根据Visual Studio运行程序时调用的堆栈信息来得知;
查看调用堆栈的方法:
通常方法
1. 在程序(将会执行到的)代码中添加断点;
2. 以“调试”方式运行程序;
3. 程序将在断点处暂停,此时便可在VS窗口右下角“调用堆栈”栏查看堆栈信息(若没有,则可在调试时于VS菜单栏的视图里寻找)。
特殊方法
1. 发生“读取/写入位置发生访问冲突”时,点击提示窗口上的“中断”按钮;
2. 光标将直接定位到程序最后执行的代码行;
3. 此时可在VS右下角的查看到“调用堆栈”视图,根据调用层级来挨个寻找发生访问冲突的准确位置。
注意查看发生异常时的错误提示,看是“读取”还是“写入”发生访问冲突,可以根据这点以及查看局部变量的值来精确定位引起异常的指针变量;
本例中,提示的是写入冲突,故应该是给非法指针赋值。
而调用堆栈中的指针赋值语句就只有
*p = 123;
大致确定p指向的内存空间无法写入。
最后,检查该指针变量是否为NULL,或者其所指的内存空间为NULL,可能定义了指针但未给指针分配合适的内存空间(可使用malloc、new来分配空间)。
可在VS中查看“p”的值为0,很明显其未指向合法的内存地址,故执行改行赋值语句发生写入冲突!
关于我
> 我是一位喜欢创新、乐观向上的少年
> 爱好是看书、踢足球、玩LOL等
> 喜欢我的文章的朋友,可以添加个人微信:`CS-huo`
> 有问题可以相互探讨,共同学习!