[英]Can a C++ std::list iterator move past the end?
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);
}
迭代器是否可能指向列表末尾之外的一些垃圾數據?
您可以通過擦除迭代器來使其無效。
您可以將循環更改為:
std::list<MyClass *>::iterator it = m_currentJobs.begin();
while(it != m_currentJobs.end())
{
// ...
it = m_currentJobs.erase(it);
}
並回答您的問題:是的,可能有一個無效的迭代器(不限於結束時的迭代器)。 使用這些會涉及不確定的行為。
在每個迭代的末尾,您可以執行以下操作:
m_currentJobs.erase(it);
這it
無效。
之后,立即執行以下操作:
++it
如果it
不是有效的迭代器it
則這是未定義的行為。
這很可能是您的問題。
std::list::erase
實際上返回一個迭代器,指向被刪除元素之后的元素。 重置it
指向的是,和你的代碼應工作好了很多。 (請注意,發生這種情況時,您已經跳到了下一個元素,因此您不應該在該迭代中也運行++it
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.