В настоящее время я работаю над проектом, точнее игрой с танграмом. У меня проблема с segfault, и я не понимаю, почему.
Учитывая, что у меня есть целый проект, я постараюсь упростить проблему: у меня есть класс GameManager, который содержит, в частности, объект Menu ( и другие вещи, но я не думаю, что это важно. GameManager используется для инициализации этого объекта и управления им. Меню содержит вектор Button (каждая кнопка имеет лямбду, которая выполняет действие, когда пользователь нажимает на нее) .
std::vector<std::unique_ptr<Button>> buttons;
Чтобы проиллюстрировать, как это работает, я приведу пример: если пользователь нажимает кнопку «Загрузить», gameManager удаляет текущие кнопки, содержащиеся в меню, и добавляет новые кнопки в этом меню.
void GameManager::initMainMenuButtons() {
...
menu -> addButton(std::unique_ptr<Button>(new Button(x1, y1, x2, y2, "Create",
[this]{
std::cout << "Create level" << std::endl;
menu->clear()
initCreateLevelButtons();
actionManager->setMenu(menu);
}
)));
...
}
В этом примере кода у меня есть метод initMainMenuButtons, который добавляет несколько кнопок в меню, например «Загрузить» или «Выход». Когда пользователь нажимает «Создать», я хочу изменить интерфейс (добавление и удаление кнопок). Итак, чтобы удалить кнопки, я вызываю метод clear ()
void Menu::clear() {
buttons.clear();
decorationPieces.clear(); // not interesting
}
Я использую unique_ptr, поэтому я не не нужно удалять кнопки вручную. Пока проблем нет: вектор кнопок кажется пустым (размер равен 0). Затем вызывается метод initCreateLevelButtons (). Этот метод очень похож на initMainMenu: он добавляет кнопки в меню, больше ничего. Во время этого вызова кнопки, кажется, правильно добавлены в вектор, я напечатал содержимое вектора в конце, и вектор содержит правильные кнопки.
И там возникает проблема: после вызова initCreateLevelButtons (), возникает ошибка, когда я хочу использовать меню, поэтому actionManager->setMenu(menu);
не работает. Я попытался напечатать меню std::cout << menu << std::endl
и проверить, является ли этот указатель nullptr, но он также не работает. Я не понимаю, почему меню кажется правильным в последней строке initCreateLevelButtons () и становится недействительным сразу после. Если я не очищаю вектор кнопок (меню-> инструкция очистки), программа работает, но последние кнопки все еще здесь).
Я попытался использовать необработанные указатели, и я заметил, что Программа может очищать вектор, пока кнопки не удалены (если я добавлю al oop для удаления кнопок, проблема возникнет), поэтому я пришел к выводу, что проблема заключается в удалении кнопок. Я не понимаю, почему, я застрял. Я не знаю, объяснил ли я это хорошо, потому что, как я уже сказал, код является частью целого проекта, трудно вводить классы, не вводя другие вещи. если вам нужны подробности или полный код методов, я могу предоставить их.