gpt4 book ai didi

c++ - 从 vector 中删除元素后出现段错误

转载 作者:行者123 更新时间:2023-12-02 09:46:40 24 4
gpt4 key购买 nike

我目前正在开发一个项目,更准确地说是一个七巧板游戏。我遇到了段错误问题,但我不明白为什么。

鉴于我有一个完整的项目,我会尝试简化问题:我有一个 GameManager 类,其中特别包含一个 Menu 对象(以及其他东西,但我认为这并不重要。gameManager 用于初始化该对象并管理它。菜单包含一个按钮 vector (每个按钮都有一个 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,因此,我不必手动删除按钮。到目前为止,没有问题:按钮 vector 似乎是空的(大小为 0)。接下来,调用方法 initCreateLevelButtons()。此方法与 initMainMenu 非常相似:它在菜单中添加按钮,仅此而已。在此调用期间,按钮似乎已正确添加到 vector 中,我在末尾打印了 vector 的内容,并且 vector 包含正确的按钮。

问题就出现了:调用 initCreateLevelButtons() 后,当我想使用菜单时出现段错误,所以 actionManager->setMenu(menu);不起作用。我尝试打印菜单 std::cout << menu << std::endl ,并测试这个指针是否为nullptr,但也不起作用。我不明白为什么菜单在 initCreateLevelButtons() 的最后一行似乎是正确的,但之后就变得无效了。如果我没有清除按钮 vector (菜单->清除指令),程序可以工作,但是,最后一个按钮仍然在这里)。

我尝试使用原始指针,我注意到只要不删除按钮,程序就能够清除 vector (如果我添加一个循环来删除按钮,就会出现问题),所以,我得出的结论是问题是按钮删除。我不明白为什么,我被困住了。我不知道我是否解释得很好,因为正如我已经说过的,代码是整个项目的一部分,很难在不引入其他东西的情况下引入类。如果您想要详细信息或完整的方法代码,我可以提供。

最佳答案

  1. 菜单维持某些按钮的生​​命周期
  2. button维持lambda的生​​命周期
  3. 当您点击按钮时,lambda 会清除菜单
  4. menu析构函数清除buttonbutton清除lambda
  5. lambda 在实际上已经被销毁时继续执行 -> 未定义的行为以崩溃结束

现在的问题是:您拥有 Button 类吗?
如果是,那么修复它的最简单方法是在按钮中调用 lambda 的拷贝。

关于c++ - 从 vector 中删除元素后出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60266979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com