我在过去几天里第一次开发QT应用程序并且进展顺利。今天我在程序中添加了常规的C ++函数并对其进行了测试。
1.如果我删除对此函数的调用,那么程序将完美运行而不会崩溃(当然没有新功能)
2.如果我将函数调用回程序,那么我的程序将在运行时崩溃(当我单击按钮启动程序时)。
3.但是,如果我将该函数留在程序中,并在函数的开头放置一个断点,我可以逐步完成整个程序,直到它完成而没有一次崩溃。 有没有人经历过这样的事情?
以下是导致此问题的功能(我相信我遇到了访问冲突错误):
void SokoGenerator::rotatePattern(twoDVector *pattern, int rotation){
twoDVector tempPattern = *pattern;
if(rotation == 1){
//Rotate by 90 - reverse each row
for(int i = 0; i < tempPattern[i].size(); i++){
std::reverse(tempPattern[i].begin(), tempPattern[i].end());
}
*pattern = tempPattern;
}
else if(rotation == 2){
//Rotate by 180 - reverse each row, then each column
for(int i = 0; i < tempPattern[i].size(); i++){
std::reverse(tempPattern[i].begin(), tempPattern[i].end());
}
std::reverse(tempPattern.begin(), tempPattern.end());
*pattern = tempPattern;
}
else if(rotation == 3){
//Rotate by 270 - reverse each column
std::reverse(tempPattern.begin(), tempPattern.end());
*pattern = tempPattern;
}
}
快速背景 - &#39; twoDVector&#39;是我创建的类型,声明为:
typedef <vector <vector<char> > twoDVector;
答案 0 :(得分:2)
问题似乎是for循环中的条件。
for (auto& e: tempPattern)
std::reverse(e.begin(), e.end());
将运行多次等于向量中第一行的列数。如果这与向量中的行数不同,那么您要么不会更改足够的数据,要么超过向量的末尾,这是未定义的行为并且可能导致访问冲突。
如果要循环遍历向量中的所有行,则需要
{{1}}
或者更好地使用ranged based for loop之类的
{{1}}