C++ 如何调试和修复运行时错误,如“0x…in…exe:0xC0000005:访问冲突写入位置0x…处未处理的异常”
对于我的一个项目,我正在编写一个保存文件读取器。 在最新版本中,我在Final Assessment.exe的0x00075256处收到一个运行时错误未经处理的异常:0xC000005:访问冲突写入位置0xCCCC 我如何才能继续识别和纠正此错误的来源 我相信在创建ifstream对象保存文件时会发生错误,但我一直无法找到确切的源代码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
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]++你说得对,谢谢,我从没意识到那会导致错误。