Как отладить и исправить ошибку времени выполнения, например «Необработанное исключение в 0x… in… exe: 0xC0000005: Место записи нарушения доступа 0x…»

0

Для моего проекта я пишу файл для чтения файлов. В последней сборке я получаю ошибку времени выполнения Unhandled exception at 0x00075256 in Final Assessment.exe: 0xC0000005: Access violation writing location 0xCCCCCCCC.

Как я могу найти и исправить источник этой ошибки?

Я считаю, что ошибка возникает, когда я создаю объект saveFile(), но я не смог найти точный источник.

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;
    }
}

Изображение 174551

Теги:

1 ответ

8
Лучший ответ

Возможно, это не причина вашей аварии, но здесь идет:

while (!saveFile.eof()) - это анти-шаблон, который является общим источником ошибок "один за другим". Причина в том, что он возвращает true только после того, как делается попытка прочесть конец файла. Это означает, что вы слишком много используете одну итерацию, один x++ слишком много, и вы выходите за границы в data[x], вызывая неопределенное поведение.

Иногда. К сожалению, вы можете уйти от него, и он, похоже, сработает.

Измените цикл на

while (getline(saveFile, tempString) && x < 9) {
    data[x] = temp;
    ++x;
}

и посмотреть, не изменилось ли это.

(Приведенный выше код не учитывает ввод с менее чем 9 строк, заметьте. Кроме того, я бы предложил использовать std::vector вместо C-массива.)

  • 0
    Вы правы, спасибо, я так и не понял, что может вызвать ошибку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню