我正在编写一个分析游戏的代码,我遇到了问题。 此代码遍历7个六面骰子(从1111111到6666666)的每个组合,并且如果组合产生某些点,则会看到它所看到的每种组合。所以我试着检查它是否可以在控制台中放入每个骰子组合以及与之相关的点进行检查,它运行正常,直到1223353但是在1223354它"崩溃",如图所示。{{3 }}。 所以我不明白为什么它会在~10和000次迭代后停止。
P.S。:我试图在代码块中运行它,它也没有工作......
感谢您的回答!
答案 0 :(得分:0)
好的,当调试器到达此行时,它会崩溃:
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
每次时间您将要访问在循环中更改大小的向量,您必须添加以下检查:
if ( ( k < sptopt.size() ) && ( j < sptopt.size()) &&
( k < sdesopt.size() ) && ( j < sdesopt.size()) &&
( k < soptch.size() ) && ( j < soptch.size()) ...
否则,您访问/删除不存在的元素。在删除的情况下,您会收到运行时错误。当只访问时,C ++可能不会那么善意地告诉你,你不是你想象的那样(它确实输入了k是无效索引的函数),从那时起你的程序表现得非常奇怪。
所以你需要查看你的函数并确保你的变量永远不会超过你正在使用的向量的维度。