簡體   English   中英

C ++ std :: list迭代器可以移到末尾嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM