程序在运行时崩溃,但在单步执行时不会崩溃

Program Crashes at Runtime, but doesn't crash when being stepped through

本文关键字:崩溃 执行 运行时 程序 单步      更新时间:2023-10-16

在过去的几天里,我一直在第一次开发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;
    }
}

快速背景 - "twoDVector"是我创建的类型,声明为:

typedef <vector <vector<char> > twoDVector;

问题似乎是 for 循环中的条件。

for(int i = 0; i < tempPattern[i].size(); i++)

将运行等于向量中第一行的列数的次数。 如果这与向量中的行数不同,那么您要么不会更改足够的数据,要么会超过向量的末尾,这是未定义的行为,可能会导致访问冲突。

如果你想遍历向量中的所有行,那么你需要有

for(int i = 0; i < tempPattern.size(); i++)

或者更好的是使用基于范围 for 循环,例如

for (auto& e: tempPattern)
    std::reverse(e.begin(), e.end());