C ++ Вектор указателей, слишком много пропусков? - PullRequest
0 голосов
/ 18 июля 2011

Я часами пытался понять, как решить эту проблему с ошибками сегментов.

У меня карточная игра на C ++, четыре игрока.Игроком (базовый класс) может быть компьютер или человек (производные классы).Для их хранения у меня есть другой класс playerContainer, который имеет свои собственные функции и использует закрытый вектор указателей игроков.

std::vector<Player*> players_;

Когда я добавляю нового игрока в вектор, я делаю что-то вроде этого:

Human *newPlayer = new Human();
container.add(newPlayer);

Где добавить это:

void playerContainer::add(Player* newPlayer) {
   players_.push_back(newPlayer);
}

И затем у меня есть один класс, называемый gameLogic, который имеет приватный член playerContainer и выполняет инициализацию игрока (среди прочего).

Однако я получаю ошибки сегмента после попытки включить его в реализацию MVC.

В графическом интерфейсе вы нажимаете кнопку, чтобы запустить игру.Кнопка вызывает функцию startGame окна, которая собирает параметры и затем вызывает закрытый член startGame класса Model, который затем вызывает функцию initializePlayer своего закрытого члена gameLogic, которая затем вызывает функцию добавления своего закрытого члена playerContainer.В этот момент программа не работает.

При небольшом тестировании я обнаружил, что при сохранении шага ошибки не возникнет.Например, если бы я дал объекту окна объект gameLogic, а затем вызвал его функцию initializePlayer и т. Д., Программа работала бы нормально без ошибок.

Я уверен, что есть лучшее решение, чем объединение модели.и классы gameLogic, поскольку они уже довольно раздуты.Может ли кто-нибудь дать некоторое представление?

Кроме того, если это немного сбивает с толку, пожалуйста, попросите меня уточнить.Я приложил все усилия, чтобы четко объяснить, но с таким большим количеством различных классов это становится трудно сделать.

РЕДАКТИРОВАТЬ: Не могу попробовать заменить Player * на int, код слишком велик для меняв состоянии сделать это любым своевременным способом.

Я пробовал valgrind, но журнал был огромен и, как правило, бесполезен.Или, по крайней мере, я не мог понять это.Для тех, кто хочет взглянуть, вот ссылка на scribd: http://www.scribd.com/doc/60210916/Memory-Leak

Ошибка сегмента возникает в функции добавления playerContainer, в строке push_back.

Я попробуюмоя рука у отладчика ...

1 Ответ

0 голосов
/ 18 июля 2011

Вы уверены, что ваша модель где-то, но перед вызовом initializePlayer, фактически выделяет playerContainer?

...