C++ 为什么输出错误会崩溃?

C++ 为什么输出错误会崩溃?,c++,console,C++,Console,我正在写一个代码来分析一个游戏,我遇到了一个问题。 此代码将遍历7个六面骰子的每个组合(从1111111到66666),并针对每个组合查看该组合是否获得了一些分数。所以我试着检查它是否能把每一个骰子组合和相关的点数放在控制台中,只是为了检查,它运行良好,直到1223353,但在1223354它“崩溃了”,如图所示。。 所以我不明白为什么它在大约10000次迭代之后就停止了 附言:我试着在代码块中运行它,但它也不起作用 谢谢你的回答 好的,当调试器到达这一行时,它会崩溃: if (sptopt[k

我正在写一个代码来分析一个游戏,我遇到了一个问题。 此代码将遍历7个六面骰子的每个组合(从1111111到66666),并针对每个组合查看该组合是否获得了一些分数。所以我试着检查它是否能把每一个骰子组合和相关的点数放在控制台中,只是为了检查,它运行良好,直到1223353,但在1223354它“崩溃了”,如图所示。。 所以我不明白为什么它在大约10000次迭代之后就停止了

附言:我试着在代码块中运行它,但它也不起作用


谢谢你的回答

好的,当调试器到达这一行时,它会崩溃:

if (sptopt[k]==sptopt[j]){ // here k == 3 and sptopt.size() == 3
    sptopt.erase(sptopt.begin()+k); // this line crashes
    sdesopt.erase(sdesopt.begin()+k);
    soptch.erase(soptch.begin()+k);
}
我已经查看了崩溃时变量的状态,事实上:

k==3和 sptopt.size()=3

基本上,您是在循环和擦除向量(从内存的角度来看,这是非常低效的),并且没有检查k的值是否不等于/大于向量的大小

这是我得到的堆栈:

Thread 1Queue : com.apple.main-thread (serial)
#0  0x00007fff95687f49 in _platform_memmove$VARIANT$Haswell ()
#1  0x000000010001b8ab in std::__1::enable_if<(is_same<std::__1::remove_const<int>::type, int>::value) && (is_trivially_copy_assignable<int>::value), int*>::type std::__1::__move<int, int>(int*, int*, int*) [inlined] at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:1904
#2  0x000000010001b856 in int* std::__1::move<int*, int*>(int*, int*, int*) [inlined] at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:1913
#3  0x000000010001b802 in std::__1::vector<int, std::__1::allocator<int> >::erase(std::__1::__wrap_iter<int const*>) [inlined] at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:1676
#4  0x000000010001b675 in main at /Users/**/Documents/iosapps/Chat App/newdaf/newdaf/main.cpp:604
thread1queue:com.apple.main-Thread(串行)
#0 0x00007fff95687f49位于_平台_memmove$变体$Haswell()
#1 0x000000010001b8ab在std::uuu 1::enable_uif::type std::uuu 1::uu move(int*,int*,int*)[inlined]at/Applications/Xcode.app/Contents/Developer/toolschains/XcodeDefault.xtoolschain/usr/bin//include/c++/v1/算法:1904
#2 0x000000010001b856 in int*std::uu 1::move(int*,int*,int*)[内联]at/Applications/Xcode.app/Contents/Developer/toolschains/XcodeDefault.xtoolschain/usr/bin/。/include/c++/v1/算法:1913
#3 0x000000010001b802在std::_1::vector::erase(std:_1::_wrap_iter)[内联]at/Applications/Xcode.app/Contents/Developer/toolschains/XcodeDefault.xtoolschain/usr/bin/。/include/c++/v1/vector:1676
#4 0x000000010001b675位于/Users/**/Documents/iosapps/Chat-App/newdaf/newdaf/main.cpp:604的main中
每次要访问循环中大小更改的向量时,必须添加检查,例如:

if ( ( k < sptopt.size() ) && ( j < sptopt.size()) &&
     ( k < sdesopt.size() ) && ( j < sdesopt.size()) &&
     ( k < soptch.size() ) && ( j < soptch.size()) ... 
if((k

否则,您将访问/删除一个不存在的元素。在删除的情况下,您会得到运行时错误。当访问时,C++可能不太好,告诉您您不是您所认为的(它确实进入了函数,K是无效的索引),并且从此以后的程序表现得非常奇怪。


因此,您需要查看您的函数,并确保您的变量永远不会超出您使用的向量的维度。

请用a来回答您的问题,或将代码作为文本和崩溃日志发布在此处。您收到了崩溃日志。您查看了吗?您是否在调试器下运行了代码?您是否做了任何事情来帮助解决您自己的问题?a显然不是。现在你想让我们在连代码都看不见的情况下解决它!我们不是魔术师。水晶球说它在10000次迭代后停止,因为你溢出了堆栈。(多么合适。)我不能添加整个代码,这是一个太长的链接,所以这里有一个链接可以看到它!很抱歉我在C++中不是很好,所以我真的不知道如何在一个调试程序中提交一个bug或者运行,我甚至不知道它意味着什么…请理解我…谢谢你的回答,但是这不是问题…我怀疑这是问题,但是只是在这条线前面,我有两个,当k和j小于向量时,它们才运行(只有两个,因为三个向量sptopt,sdesopt和soptch总是相同的大小)。尽管如此,我再次尝试将条件if放在两个for之前,但它并没有改变我的程序。无论如何,感谢您的帮助,我真的很感激!@Daniel我查看了您的代码。您指出的行除了输出一条消息,说明两个向量的大小不同之外,没有任何作用。然后程序继续运行继续进入嵌套循环,好像什么都没有错,所以我不同意给出的答案不是问题。如果您想证明,请将所有
[]
替换为
at()
访问向量中的项目。如果您现在得到的是
超出范围的
异常,而不仅仅是崩溃,请不要感到惊讶。@didiz--检查大小是可以的,但是使用
vector::at()提前显示错误
我们将不检查尺寸,而是向Daniel准确指出问题所在。非常感谢!事实上,我刚刚设置了一个条件,即jThank you@didiz获得您的答案!