jma*_*erx 5 c++ iterator stl vector
我用这段代码得到了这个错误:
for(std::vector<AguiTimedEvent*>::iterator it = timedEvents.begin();
it != timedEvents.end();)
{
if((*it)->expired())
{
(*it)->timedEventCallback();
delete (*it);
it = timedEvents.erase(it);
}
else
it++;
}
Run Code Online (Sandbox Code Playgroud)
可能是什么问题呢?
定时事件有时会在调用其回调时推送新的事件,这可能会发生
谢谢
如果循环遍历向量并且回调函数导致向量被添加到,则向量中的所有迭代器都可能无效,包括循环变量it.
在这种情况下(回调修改向量),最好使用索引作为循环变量.
您可能需要对设计进行一些全面的分析,以确保您不会创建任何意外的无限循环.
例如
for(std::vector<AguiTimedEvent*>::size_type n = 0;
n < timedEvents.size();)
{
if(timedEvents[n]->expired())
{
timedEvents[n]->timedEventCallback();
delete timedEvents[n];
timedEvents.erase(timedEvents.begin() + n);
}
else
n++;
}
Run Code Online (Sandbox Code Playgroud)