我目前正在做一个项目,更准确地说是一个七巧板游戏。我有一个段错误的问题,我不明白为什么。
鉴于我有一个完整的项目,我将尝试简化问题:我有一个 GameManager 类,其中特别包含一个 Menu 对象(和其他东西,但我认为这并不重要。gameManager 用于初始化它对象并对其进行管理。菜单包含一个按钮向量(每个按钮都有一个 lambda,用于在用户单击它时执行一个操作)。
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);
不起作用。我尝试打印 menu std::cout << menu << std::endl
,并测试此指针是否为 nullptr,但它也不起作用。我不明白为什么菜单在 initCreateLevelButtons() 的最后一行似乎是正确的,然后就变得无效。如果我不清除按钮的向量(菜单->清除指令),程序可以工作,但是最后一个按钮仍然在这里)。
我尝试使用原始指针,我注意到只要不删除按钮,程序就能够清除向量(如果我添加一个循环来删除按钮,就会出现问题),所以,我得出的结论是问题是按钮删除。我不明白为什么,我被卡住了。我不知道我是否解释过,因为正如我已经说过的,代码是整个项目的一部分,很难在不引入其他东西的情况下引入类。如果您需要详细信息或方法的完整代码,我可以提供。