矢量迭代器不是dereferencable?

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)

可能是什么问题呢?

定时事件有时会在调用其回调时推送新的事件,这可能会发生

谢谢

CB *_*ley 7

如果循环遍历向量并且回调函数导致向量被添加到,则向量中的所有迭代器都可能无效,包括循环变量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)