2 jingaita123 jingaita123 于 2016.09.17 18:01 提问

请教一个罕见并奇怪的C++问题 100C

有一个C++程序,exe在某个特定条件下会直接崩掉,并且很稳定,报错信息为“未处理的异常 0xC0000005:读取位置0x00000000时发生访问冲突”,我进行了调试发现是在某个函数内的string做+运算的时候崩掉的,一开始我以为可能用的传入的string指针有问题,后来我直接进行了如下修改:
string title1 = "";
string title2 = "abc";
string title3 = "default123";
string title4 = "default123";
title1 = title2 + title3 + title4;
结果依然会在“title1 = title2 + title3 + title4;”这一行报错,另我百思不得其解,并且exe在debug版本是没有问题的,只会在release版本出错,还有一些奇怪的现象,就是我注释掉其他地方的某段代码,也会对exe是否崩溃产生影响,是在是搞不懂了,请问哪位大神能够不吝赐教下,感激不尽

11个回答

qq_29594393
qq_29594393   Ds   Rxr 2016.09.17 18:56

String title5=title2 + title3 + title4; 已声明的字符串不能再被赋值,或者把string title1 = ""; 改为 string title;
错误原因应该是不能修改一个字符串

liuhannan111
liuhannan111 已经声明初始化的字符串是可以再赋值的。
大约一年之前 回复
jingaita123
jingaita123 不是啊,你建议的修改方式我试了,还是一样的会在字符串+的地方出错,这个问题不是这么简单啊,太奇怪了
大约一年之前 回复
jingaita123
jingaita123   2016.09.17 19:04

不是啊,你建议的修改方式我试了,还是一样的会在字符串+的地方出错,这个问题不是这么简单啊,太奇怪了

qq_27587417
qq_27587417   2016.09.17 20:10

我运行的debug和release版本都没问题,不知道你这是啥情况。

jingaita123
jingaita123 我的程序比较大,我如果单独创建一个项目执行这个,也是没问题的,所以问题应该不是在这里,但是确实是在执行到这里的时候报错的,就是不知道什么原因会影响到这个地方啊,有没有大神能帮我看看,可以远程调一下么?
大约一年之前 回复
waterhexuan
waterhexuan   2016.09.17 21:15

release 版会优化很多东西 去除一些防错措施以提升效率 而且有些是和编译器设置有关 应该是string 上有些内存处理方式不一样

jingaita123
jingaita123 就是用的vs2005,设置也没多大差别啊,我的程序比较大,我如果单独创建一个项目执行这个,也是没问题的,所以问题应该不是在这里,但是确实是在执行到这里的时候报错的,就是不知道什么原因会影响到这个地方啊,有没有大神能帮我看看,可以远程调一下么?
大约一年之前 回复
scylhy
scylhy   2016.09.17 21:58

有可能你程序的运行库有问题,尝试一下其他运行库。

jingaita123
jingaita123 vs自带的运行库,怎么换啊?
大约一年之前 回复
qq_35553864
qq_35553864   2016.09.18 00:10

string title4 = title3;你试试这样呢?

jingaita123
jingaita123 不行唉
大约一年之前 回复
wind612
wind612   2016.09.18 09:33

我怀疑问题不是出错在这里,应该有其他的地方出现了内存越界等问题,导致运行到这个地方的时候出错了。出错在这个地方只是个偶然。好好检查一下代码的其他地方可能有帮助,希望对你有帮助。

jingaita123
jingaita123 回复草船借剑: 我也是这么尝试的,但是屏蔽了几个独立的地方,分别都能成功运行,我就不知道到底是哪个地方出问题了--!
大约一年之前 回复
wind612
wind612 回复jingaita123: 遇到这种问题是挺揪心的,要保持冷静头脑,这个时候是最考验能力的时候了。如果现在还没解决,给你一个思路:屏蔽代码。如果是毫无头绪,就大范围屏蔽代码,直到程序不再出错,再慢慢缩小范围,这个方法百试不爽,简单有效,可以一试。
大约一年之前 回复
jingaita123
jingaita123 我也怀疑是这样的,但是如果不修改代码,会稳定的出错在这个地方,其它地方我确实看不出来有啥问题,这个查起来好痛苦啊,难道只能通过看代码来分析了么?
大约一年之前 回复
WANGBIN890615
WANGBIN890615   2016.09.18 17:56

“未处理的异常 0xC0000005“这个提示代表越界访问,发生不可预知的错误,
从代码来看你这么写肯定没问题,当然是真这么写,如果你的str1是new出来的话就是越界了,
我怀疑你不是这里错了,你这里只写了一部分代码。

jingaita123
jingaita123 我是只给了一部分代码的,整个工程还有很大一部分,但是每次问题就是出在这个地方,我怀疑是其他地方出了问题,但是通过查看代码却完全找不到头绪,没有更好的定位错误的方法了吗
大约一年之前 回复
qq_35553864
qq_35553864   2016.09.18 19:46

估计你得看看调用堆栈信息了

jingaita123
jingaita123 出错的时候,调用栈信息就在这个地方,所以完全看不出问题出在哪儿了,跟到c库代码里,完全搞不懂了,并且有些栈没有代码,好恼火啊
大约一年之前 回复
u011606457
u011606457   2016.09.19 16:07

0xC0000005 表示使用了未创建(未分配内存空间)的变量或对象。
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

在出现异常的时候会弹出一个对话框点击 中止 会跳转到调用堆栈,双击错误的地方会调用的调用函数出错的地方?里面的参数鼠标停留每一个变量上,会告诉你当前的变量值是多少, 以及那个变量错误!

共11条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片