Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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循环。