C++ Can a C++;列表迭代器是否移动到末尾? for(std::list::iterator it=m_currentJobs.begin();it!=m_currentJobs.end();+it) { 请求=*它; if(请求!=NULL) { printf(请求->状态()); } 删除请求; m_currentJobs.erase(它); }
迭代器是否可以指向列表末尾以外的一些垃圾数据?在每次迭代结束时,您可以执行以下操作:C++ Can a C++;列表迭代器是否移动到末尾? for(std::list::iterator it=m_currentJobs.begin();it!=m_currentJobs.end();+it) { 请求=*它; if(请求!=NULL) { printf(请求->状态()); } 删除请求; m_currentJobs.erase(它); },c++,list,stl,iterator,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()); } delet
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);
}
m_currentJobs.erase(it);
它使无效
之后,您立即执行以下操作:
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);
}
m_currentJobs.erase(it);
如果不是有效的迭代器,则为未定义的行为
很可能,这就是你的问题
std::list::erase
实际上返回一个迭代器,指向已删除元素之后的元素。重置它
指向该点,您的代码应该工作得更好。(请注意,发生这种情况时,您已经跳转到下一个元素,因此您不应该在该迭代中运行++it
)在每个迭代结束时,执行以下操作:
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);
}
m_currentJobs.erase(it);
它使无效
之后,您立即执行以下操作:
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);
}
m_currentJobs.erase(it);
如果不是有效的迭代器,则为未定义的行为
很可能,这就是你的问题
std::list::erase
实际上返回一个迭代器,指向已删除元素之后的元素。重置它
指向该点,您的代码应该工作得更好。(请注意,当发生这种情况时,您已经跳到下一个元素,因此您不应该在该迭代中运行++it
)您通过删除迭代器使其无效
您可以将循环更改为:
++it
std::list::iterator it=m_currentJobs.begin();
while(it!=m_currentJobs.end())
{
// ...
它=m_currentJobs.erase(它);
}
回答您的问题:是的,可能有一个无效的迭代器(不限于迭代器超过末尾)。使用这些函数涉及未定义的行为。通过删除迭代器,使迭代器无效
您可以将循环更改为:
++it
std::list::iterator it=m_currentJobs.begin();
while(it!=m_currentJobs.end())
{
// ...
它=m_currentJobs.erase(它);
}
回答您的问题:是的,可能有一个无效的迭代器(不限于迭代器超过末尾)。使用这些方法涉及到未定义的行为。这是有道理的,我欣赏它更明确。这是有道理的,我欣赏它更明确。我想知道为什么它有时会起作用。我想这就是它没有定义的原因。该线程在代码库中有更多的逻辑,因此更难检测错误。您是否认为它真正导致错误的唯一时间可能是迭代器结束时?我现在总是把它收回去。如果它是结束,那么我就会打破for循环。我想知道为什么它有时会起作用。我想这就是它没有定义的原因。该线程在代码库中有更多的逻辑,因此更难检测错误。您是否认为它真正导致错误的唯一时间可能是迭代器结束时?我现在总是把它收回去。如果它是结束,那么我打破for循环。