我收到以下错误代码:

for(std::vector<AguiTimedEvent*>::iterator it = timedEvents.begin();
    it != timedEvents.end();)
{
    if((*it)->expired())
    {
        (*it)->timedEventCallback();
        delete (*it);

        it = timedEvents.erase(it);
    }
    else
        it++;
}

可能是什么问题呢?

定时事件有时会在调用其回调时插入一个新事件,这可能会做到这一点

谢谢

最佳答案

如果遍历 vector ,并且回调函数导致将 vector 添加到 vector ,则进入 vector 的所有迭代器可能都无效,包括循环变量it

在这种情况下(回调会修改 vector ),最好使用索引作为循环变量。

您可能需要对设计进行一些彻底的分析,以确保不会创建任何意外的无限循环。

例如。

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++;
}

关于c++ - vector 迭代器不可取消?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4504883/

10-11 10:52