2015-04-13 2 views
0

Я искал высоко и низко для решения этой проблемы и не смог ее найти, поэтому я прибегал к простому запросу. Моя программа - игра в лабиринт, состоящая из нескольких разных комнат, каждая из которых связана с одной или несколькими соседними комнатами с помощью указателей. Игрок перемещается из комнаты в комнату, пока не найдет выход.Исключение «bad_alloc», вызванное во время вызова метода

Когда программа доходит до этой строки в моей Turn() функции, вызов getName() бросает «bad_alloc» исключение:

cout << "You are currently in " << current->getName() 
//that's not the entire line but it's the important bit 

Все getName() делает это вернуть имя комнаты в виде строки. current является указателем типа Room*, что указывает на комнату пользователь в настоящее время в я предполагаю, что это указатель, где проблема лежит, но она четко определена в main():.

int main() 
{ 
    //first I create a Maze object to hold important variables, and then the nineteen rooms 
    Maze maze = Maze(); 
    Room room1 = Room("Room A"); 
    Room room2 = Room("Room B"); 
    Room room3 = Room("Room C"); 
    //and so on... 
    Room empty = Room(""); //used as a placeholder for rooms with less than five adjacent rooms 

    //set the rooms adjacent to each room 
    room1.SetAdjacent(room2, room3, room4, empty, empty); 
    room2.SetAdjacent(room1, room5, room6, empty, empty); 
    room3.SetAdjacent(room1, room6, room7, room15, empty); 
    //and so on... 

    //this explicitly sets the "current" pointer to point to room1: 
    maze.SetCurrent(&room1); 

    cout << "Welcome to The Maze Game. Can you find your way out?" << endl; 
    system("pause"); 

    do 
    { 
     maze.Turn(); 
     if (maze.GetWinStatus() == true) 
     { 
      cout << "You have reached the exit! Congratulations!" << endl; 
     } 
     system("pause"); 
    } while (maze.GetWinStatus() == false); //if the player hasn't moved to the exit, then it loops round for another turn 

    return 0; 
} 

Так что я могу» t выяснить, почему на земле это бросает это исключение. Если вы хотите посмотреть любой другой код, пожалуйста, спросите, и я с радостью отправлю его здесь.

EDIT 2: Вот все Room класса, в соответствии с просьбой:

class Room 
{ 
private: 
    string roomName; 
    Room* adjacentRooms[5]; 
public: 
    Room(string name); 
    string getName(); 
    void SetAdjacent(Room adj1, Room adj2, Room adj3, Room adj4, Room adj5); 
    Room* GetAdjacent(int room); 
}; 

Room::Room(string name) 
{ 
    roomName = name; 
} 

string Room::getName() //this is the bit that makes it crash 
{ 
    return roomName; 
} 

void Room::SetAdjacent(Room adj1, Room adj2, Room adj3, Room adj4, Room adj5) 
{ //sets which rooms are adjacent to the room this function is called from 
    adjacentRooms[0] = &adj1; 
    adjacentRooms[1] = &adj2; 
    adjacentRooms[2] = &adj3; 
    adjacentRooms[3] = &adj4; 
    adjacentRooms[4] = &adj5; 
} 

Room* Room::GetAdjacent(int room) 
{ //returns one of the five adjacent rooms. Numbers 1-5 are used as inputs for user convenience 
    return adjacentRooms[room - 1]; //the number is lowered by 1 to get the right room in the array 
} 
+1

'bad_alloc' означает, что вы, вероятно, исчерпали память (он не мог выделить новую строку). Возможно, у вас где-то есть действительно плохая утечка памяти? Или (более вероятно) размер строки, которую он пытается выделить, является смехотворно огромным из-за неинициализированной памяти, неопределенного поведения и т. Д. Покажите нам конструктор 'Room'. – Cameron

+1

Могло бы также быть ошеломляющее количество распределений, происходящих где-то из-за разбитого алгоритма. Наблюдайте за использованием вашей памяти с помощью какого-то инструментария. Кроме того, почему вы делаете такие вещи, как 'if (x == true)', когда 'if (x)' или 'if (! X)' будет достаточным? Попытайтесь сохранить это более самодостаточным, где 'system (" pause ")' следует заменить кодом C++, ожидающим новую строку. Викинг процесса для чего-то столь же тривиального, как это просто беспорядочно. – tadman

+1

Я подозреваю, что 'SetAdjacent' принимает свои параметры по значению, и вы сохраняете указатели, которые вы получаете с помощью' & '-ing. – molbdnilo

ответ

2

Вашей проблема вашего SetAdjacent метод:

void SetAdjacent(Room adj1, Room adj2, Room adj3, Room adj4, Room adj5); 

следует принимать в своих параметрах по ссылке:

void SetAdjacent(Room& adj1, Room& adj2, Room& adj3, Room& adj4, Room& adj5); 

Что происходит, так это то, что вы возвращаете адрес временного объекта, выходящего за пределы области действия после возвращения функции. Последующие обращения к этой памяти являются неопределенным поведением.

+0

Это сработало! Кажется, я искал ошибку в неправильном месте: P Спасибо вам большое! – F1Krazy

Смежные вопросы