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);
}
迭代器是否有可能指向列表末尾之外的一些垃圾数据?
答案 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
。)