使用C ++将我的游戏引擎中的一些代码从Mac移植到Windows,我得到了这个运行时错误:“矢量擦除外部范围”。它适用于Mac!
void Entity::runDeferreds() {
for (auto it = deferreds.begin(); it != deferreds.end(); /* nothing */ ) {
if (it->Condition()) {
it->Execution();
it = deferreds.erase(it);
} else {
++it;
}
}
}
这会迭代一系列“延迟”任务,这些任务存储在名为std::vector<DeferredCall>
的{{1}}中。如果deferreds
的{{1}}已满足,则会运行DeferredCall
,并应将其从Condition()
中删除。但是,相反,我得到上述错误!
DeferredCall看起来像这样,而不是它太重要了:
Execution()
帮助?!
编辑: - 替代方法
我也试过这个,再次在Mac上工作:
vector
然而,在这种情况下,我得到“矢量迭代器不兼容”。
答案 0 :(得分:5)
虽然它没有回答您的错误来自哪里,但您可以尝试按如下方式重新编写代码:
const auto pred = [](Deferred& d){ return !d.Condition(); };
auto itMatch = std::partition( defs.begin(), defs.end(), pred);
const auto action = [](Deferred& d){ d.Execution(); };
std::for_each(itMatch, defs.end(), action);
defs.erase(itMatch, defs.end());
此外,std::vector::erase保证返回完全有效的迭代器。可能是vector::end()
。