程序在调试中工作正常,但在发布中不行

Program works fine in Debug, but not in Release

本文关键字:布中不 调试 工作 程序      更新时间:2023-10-16

我制作了一款效果不错的井字游戏。最近我决定添加一个重置游戏功能。这里是我从user

获取输入的部分
void playerMove() //Gets the player move and updates the box variables
{
    int boxnumber;
    while(1)      //Set's loop if the player enters a invalid input
    {
       cout << "n Player " << player << "'s turn!(Press 0 to reset the game!): ";
       cin >> boxnumber;
       if(box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O' || boxnumber > 9 || boxnumber < 0) // Checks if the input is valid or not
       {
           system("CLS");//If invalid, show error and loop back to start to get new input
           displayBoard();
           cout << "n Invalid Input! Try again!n";
       }else if(boxnumber == 0)
       {
           refreshGame();
           displayBoard();
       }else
       {
           box[boxnumber-1] = player;//If inputs are fine, set the box variable's and break out of loop!
           break;
       }
    }
}

现在,在调试模式下,当我按0时,一切运行正常,游戏被重置,但在发布版本中,当我按0时,它给我"无效输入!"再试一次!"

我试过的东西都不起作用:-重新构建整个发布和调试版本。-创建一个新项目并复制粘贴我的代码。同样的道理,调试可以,发布不行。

对于任何想知道的人,我使用code::blocks IDE。编译器是GNU GCC。谢谢你的帮助!:)

您有未定义行为

在"第一个"if中,您有box[boxnumber-1],因此当您输入0(正如您在问题中所述)时,您试图访问索引为-1的元素。这是UB,因为你正在读取"无效"内存。

您应该首先检查0(以及负数)。

if语句中,将范围检查放在值检查之前。也就是说,修改

if(box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O' || boxnumber > 9 || boxnumber < 0)

if(boxnumber < 0 || box number > 9 || box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O')

利用了短路的优势:如果输入值小于0或大于9,则不会执行值检查。这将避免检查像box[10]这样的东西,这是无效的。

仍然留下了一个问题:如果用户输入0,该代码将很高兴地检查box[-1],这也超出了范围。要消除这种情况,请将测试box number == 0if语句的分支移到该部分前面:

if (box number == 0)
    // whatever
else if (box[boxnumber-1] == 'X' || box[boxnumber-1] == 'O' || boxnumber > 9 || boxnumber < 0)
    // whatever else