C ++ std :: list迭代器可以移动到最后吗?

时间:2014-04-09 17:31:50

标签: c++ list stl iterator

for(std::list<MyClass *>::iterator it = m_currentJobs.begin(); it != m_currentJobs.end(); ++it)
{
    request = *it;
    if(request != NULL)
    {
        printf(request->status());
    }

    delete request;
    m_currentJobs.erase(it);
}

迭代器是否有可能指向列表末尾之外的一些垃圾数据?

2 个答案:

答案 0 :(得分:6)

通过擦除它使您的迭代器无效。

您可以将循环更改为:

std::list<MyClass *>::iterator it = m_currentJobs.begin();
while(it != m_currentJobs.end())
{
    // ...
    it = m_currentJobs.erase(it);
}

并回答你的问题:是的,可能有一个无效的迭代器(不限于过去的迭代器)。使用这些涉及未定义的行为。

答案 1 :(得分:3)

在每次迭代结束时,您执行以下操作:

m_currentJobs.erase(it);

使it无效。

之后,您立即执行此操作:

++it

如果it不是有效的迭代器,则为未定义的行为。

最有可能的是,这是你的问题。

std::list::erase实际上返回一个迭代器,指向删除后的元素。重置it以指向它,您的代码应该可以更好地工作。 (请注意,当发生这种情况时,您已经跳转到下一个元素,因此您不应该在该迭代中运行++it。)