Xcode 11db错误的事情:线程1:EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)

时间:2015-09-27 05:00:35

标签: c++ xcode text-based

我一直在尝试在Xcode中编写游戏,其中使用char类型的多维数组在终端中绘制游戏板。游戏应该像一个地牢,你可以踩到门,当你在新的房间里生成。但有时我觉得这个非常令人讨厌的“(11db)”错误的事情,其中​​一条线突出显示:

  

“主题1:EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)”

这不是我第一次在Xcode中遇到(11db)错误,之前我已经能够解决它,但这次我似乎无法解决。这个错误意味着什么?我发现最烦人的部分是每次都不会发生。有时它会在我创建房间时一旦我运行程序就会发生,有时它会在你通过一扇门之后发生,而我甚至可以在没有它的情况下进行。这是代码发生的地方:

    door_x = randomNumber(height - 1, 1);
    door_y = randomNumber(width - 1, 1);

    //Check to see if door location is the same an an enemy or the player
    for (int i = 0; i < enemies.size(); i++){
        while ((door_x == enemies.at(i).getX() && door_y == enemies.at(i).getY()) || (door_x == player->getX() && door_y == player->getY())){
            door_x = randomNumber(height - 1, 1);
            door_y = randomNumber(width - 1, 0);
        }
    }
    room[door_y][door_x] = DOOR;//Place door on map

此错误发生在上述C ++代码的最后一行。究竟出了什么问题?为什么?

这是创建新房间和随机数功能的整个功能。

int randomNumber(int max, int min){
    int randomNumber = rand() %(max - min) + min;
    return randomNumber;
}

void create_new_room(){
    //Get random room height and room width
    height = randomNumber(settings[0], settings[1]);
    width = randomNumber(settings[2], settings[3]);

    room = new char*[height];
    for (int iter = 0; iter != height; iter++) {
        room[iter] = new char[width];
    }

    for (int i = 0; i < height; i++){
        for (int j = 0; j < width; j++){
            room[i][j] = EMPTY;
        }
    }

    enemies.clear();//Delete every object from the vector

    //Create the enemies
    int numEnemies = randomNumber(settings[4], settings[5]);

    for (int i = 0; i < numEnemies; i++){
        int randomHeight = randomNumber(height, 0);
        int randomWidth = randomNumber(width, 0);
        Enemy *e;//Create pointer to class to allow vector class push back
        e = new Enemy(randomWidth, randomHeight, HEALTH);
        enemies.push_back(*e);
        delete e;//Delete pointer e to free memory and avoid any memory leak.
        room[enemies.at(i).getY()][enemies.at(i).getX()] = ENEMY;//Place enemy on board
    }

    //Create Player
    int player_y = randomNumber(height, 0);
    int player_x = randomNumber(width, 0);
    for (int i = 0; i < enemies.size(); i++){
        while (player_x == enemies.at(i).getX()){
            player_y = randomNumber(height, 0);
            player_x = randomNumber(width, 0);
        }
    }
    player = new Player(player_x, player_y, ATTACK);

    //Place player on board
    room[player->getY()][player->getX()] = PLAYER;

        //Create a door
        door_x = randomNumber(height - 1, 1);
        door_y = randomNumber(width - 1, 1);

        //Check to see if door location is the same an an enemy or the player
        for (int i = 0; i < enemies.size(); i++){
            while ((door_x == enemies.at(i).getX() && door_y == enemies.at(i).getY()) || (door_x == player->getX() && door_y == player->getY())){
                door_x = randomNumber(height - 1, 1);
                door_y = randomNumber(width - 1, 1);
            }
        }
        room[door_y][door_x] = DOOR;//Place door on map
}

设置[]是我拥有的一个设置数组,它从文本文件中读取值,其中包含max和min随机值的用户设置。 0 =最大高度1 =最小高度2 =最大宽度3 =最小宽度4 =最大敌人5 =最小敌人

我也在主要功能的顶部使用srand(time(0))

我的代码有点乱,但现在是。

1 个答案:

答案 0 :(得分:0)

您的代码崩溃了,因为您正在取消引用指针并最终导致内存不足。 EXC_I386_GPFLT基本上是异常,i386(您的CPU架构),一般保护错误,这意味着您的代码正在尝试读取或写入不应该的内存。

查看您的代码,room未设置(可能仍为NULL?)或已经释放,或door_xdoor_y已超过您分配给room(也许你的randomNumber方法有错误?)

您需要在代码崩溃之前打印roomdoor_xdoor_y的值,然后您需要向我们展示其余的代码,以便我们了解您的情况已分配room以及randomNumber如何运作(以及如何制定地图的大小)。

@zenith是对的,它是lldb,LLVM调试器,而不是11db。您应该阅读lldb上的教程,因为您可以从该提示中获取大量信息。