C++ 如何调试和修复运行时错误,如“0x…in…exe:0xC0000005:访问冲突写入位置0x…处未处理的异常”

C++ 如何调试和修复运行时错误,如“0x…in…exe:0xC0000005:访问冲突写入位置0x…处未处理的异常”,c++,C++,对于我的一个项目,我正在编写一个保存文件读取器。 在最新版本中,我在Final Assessment.exe的0x00075256处收到一个运行时错误未经处理的异常:0xC000005:访问冲突写入位置0xCCCC 我如何才能继续识别和纠正此错误的来源 我相信在创建ifstream对象保存文件时会发生错误,但我一直无法找到确切的源代码 bool Game::load(){ string data[9]; ifstream saveFile("save.dat"); int

对于我的一个项目,我正在编写一个保存文件读取器。 在最新版本中,我在Final Assessment.exe的0x00075256处收到一个运行时错误未经处理的异常:0xC000005:访问冲突写入位置0xCCCC

我如何才能继续识别和纠正此错误的来源

我相信在创建ifstream对象保存文件时会发生错误,但我一直无法找到确切的源代码

bool Game::load(){
    string data[9];
    ifstream saveFile("save.dat");
    int x = 0;
    if (saveFile.is_open()){
        while (!saveFile.eof()){
            getline(saveFile,data[x]);
            x++;
        }
        saveFile.close();

        string savePlayerName = data[0];
        int saveBaseHealth = stringToInt(data[1]);
        int saveHealth = stringToInt(data[2]);
        int saveKilled = stringToInt(data[3]);
        int saveMoney = stringToInt(data[4]);

        string saveWeaponName = data[5];;
        int saveAttack = stringToInt(data[6]);

        string saveArmorName = data[7];
        int saveDefense = stringToInt(data[8]);

        mainPlayer.setName(savePlayerName);
        mainPlayer.setBaseHealth(saveBaseHealth);
        mainPlayer.setHealth(saveHealth);
        mainPlayer.setEnemiesKilled(saveKilled);
        mainPlayer.setMoney(saveMoney);

        mainWeapon.setName(saveWeaponName);
        mainWeapon.setAttackPower(saveAttack);

        mainArmor.setName(saveArmorName);
        mainArmor.setDefense(saveDefense);
        return true;
    }
    else
    {
        return false;
    }
}

也许不是你坠机的直接原因,但以下是:

一会儿!saveFile.eof是一种反模式,它是一个常见的off-by-one错误源。原因是,只有在尝试读取超过文件结尾的内容后,才会返回true。这意味着你得到的一次迭代太多,一次x++太多,你在数据[x]中超出了界限,调用了未定义的行为

有时候。不幸的是,您可能会侥幸逃脱,而且它似乎会起作用

将循环更改为

while (getline(saveFile, tempString) && x < 9) {
    data[x] = temp;
    ++x;
}
看看这有没有不同


请注意,上面的代码不能解释少于9行的输入。另外,我建议您使用std::vector而不是C数组。

BTW。哪本书让你写的?你认为那是错误发生的时候。。。实际上什么时候发生的?调试告诉了你什么?你使用过调试器吗?顺便说一句,重新设计你的while循环,使之适用于int x=0;x<9&&std::getlinesaveFile,数据[x]++你说得对,谢谢,我从没意识到那会导致错误。