Я искал высоко и низко для решения этой проблемы и не смог ее найти, поэтому я прибегал к простому запросу. Моя программа - игра в лабиринт, состоящая из нескольких разных комнат, каждая из которых связана с одной или несколькими соседними комнатами с помощью указателей. Игрок перемещается из комнаты в комнату, пока не найдет выход.Исключение «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
}
'bad_alloc' означает, что вы, вероятно, исчерпали память (он не мог выделить новую строку). Возможно, у вас где-то есть действительно плохая утечка памяти? Или (более вероятно) размер строки, которую он пытается выделить, является смехотворно огромным из-за неинициализированной памяти, неопределенного поведения и т. Д. Покажите нам конструктор 'Room'. – Cameron
Могло бы также быть ошеломляющее количество распределений, происходящих где-то из-за разбитого алгоритма. Наблюдайте за использованием вашей памяти с помощью какого-то инструментария. Кроме того, почему вы делаете такие вещи, как 'if (x == true)', когда 'if (x)' или 'if (! X)' будет достаточным? Попытайтесь сохранить это более самодостаточным, где 'system (" pause ")' следует заменить кодом C++, ожидающим новую строку. Викинг процесса для чего-то столь же тривиального, как это просто беспорядочно. – tadman
Я подозреваю, что 'SetAdjacent' принимает свои параметры по значению, и вы сохраняете указатели, которые вы получаете с помощью' & '-ing. – molbdnilo