【发布时间】:2022-07-27 22:56:08
【问题描述】:
调用以下函数时出现以下错误:
这是有效的代码:
std::function<void(const Gui*)> DeleteGuiFunction = [&](const Gui* gui)
{
for (int i = 0; i < Guis.size(); i++)
{
if (Guis[i] == gui)
{
Gui* todelete = Guis[i];
Guis.erase(Guis.begin() + i);
delete todelete;
return;
}
}
};
这是具有相同逻辑但不起作用的代码:
std::function<void(const Gui*)> DeleteGuiFunction = [&](const Gui* gui)
{
for (int i = 0; i < Guis.size(); i++)
{
if (Guis[i] == gui)
{
delete Guis[i];
Guis.erase(Guis.begin() + i);
return;
}
}
};
注意 Guis 是该类的成员
不仅在使用 Guis.erase 时会出错,而且如果我在删除其中的元素后执行 Guis.size,那么它在 Vector.h 中也会出现同样的错误
这与 lambdas 有关
错误发生在删除行之后
【问题讨论】:
-
仅仅因为这是程序崩溃或报告错误的地方并不意味着这就是问题所在。 C++ 不能以这种方式工作。问题可能出现在代码中的任何地方,但在出现错误后,程序会继续运行一段时间,然后最终崩溃。这就是为什么 stackoverflow.com 的 help center 要求您展示一个 minimal reproducible example,其他人都可以完全如图所示剪切/粘贴,然后编译、运行和重现您的问题。有关更多信息,请参阅How to Ask。在您这样做之前,任何人都不太可能回答您的问题。
-
我无法发现
std::vector与您的示例有什么关系?? -
@πάνταῥεῖ Guis 是类内部的向量。我确实说过.....
-
张贴minimal reproducible example @sam 已经提到了!!
-
@Krishganatra 循环删除元素时,要么从头开始,要么连续删除第一个元素