VS调试时遇到"0xC0000005:读取位置时发生访问冲突"问题时,先别急去排除内存,看看容易忽略的配置属性。
一、配置属性
1.windows程序:
1)C+±>预处理定义中,删除_CONSOLE, 添加_WINDOWS.
2)链接器->系统,将SubSystem设为Windows(/SUBSYSTEM:WINDOWS)
2.控制台程序:
1)C+±>预处理定义中,删除_WINDOWS, 添加_CONSOLE
2)链接器->系统,将SubSystem设为CONSOLE(/SUBSYSTEM:CONSOLE)
产生"0xC0000005"的原因应是程序运行时找不到适当的入口函数。
二、内存问题
1.空指针和野指针的区别
空指针:赋为 NULL 值的指针被称为空指针。
野指针:尚未初始化为任何值(包括NULL)的指针称为野生指针。
2.已释放内存的访问;释放后的指针为什么还可以用?为什么指针释放后要赋NULL?
int *ss=new int(10);
delete ss;
*ss=11;
cout<<*ss; //结果为:11
delete只是命令系统把指针指向的堆空间回收,告诉计算机“这块空间没人在用,你可以使用了“,但指针依然指向原来的堆空间,所以delete一个指针后,要立刻把它赋值为nullptr或NULL。
3.内存越界/内存泄漏
1)定义指针的时候未初始化,指针指向的是一个随机内存空间。
2)分配到的内存比实际上使用的内存要小。
3)使用下标访问数组时,下标错误。
详情:链接: C++内存泄漏/内存越界的各种情况,以及预防与排查
三、WINDOWS系统的问题
看这个链接: Windows错误“ 0xc0000005”
还有一种曾经遇到过一次的奇葩情况,重启后能运行成功。个人猜测是指定内存未完全释放,然后该内存被访问,与代码里的内存释放无关。
欢迎在评论区分享遇到的不同情况,能分享解决方案就更好了!