迭代器失效(2)—一個例子

來源:互聯網
上載者:User

                  前幾天剛寫了一篇關於STL迭代器失效的博文(迭代器失效(1)-小心使用STL容器的erase() ),今天又犯了錯誤,原因是代碼結構的複雜性掩蓋了迭代器失效的事實。

                 現把代碼層層簡化,如下:

#include <vector>std::vector<int> myVector;void do_something();void handleElement(int val);int main(){    myVector.push_back(1);    myVector.push_back(2);    myVector.push_back(3);    myVector.push_back(4);    myVector.push_back(5);    do_something();    // handleElement(2);    return 0;}void do_something(){    std::vector<int>::iterator it = myVector.begin();    for (;it != myVector.end(); it++)    {        handleElement(*it);    }}void handleElement(int val){    std::vector<int>::iterator it = myVector.begin();    while (it != myVector.end())    {        if (val == *it)        {            it = myVector.erase(it);        }        else        {            it++;        }    }}

                這段代碼有問題嗎?運行時直接segment fault。為什嗎?

                迭代器失效了嗎?沒錯,但不是在handleElement()裡,而在do_something()。do_something()中,遍曆容器元素的過程中,handleElement()刪除了元素。

轉載本文請註明作者和出處[Gary的影響力]http://garyelephant.me,請勿用於任何商業用途!

Author: Gary Gao 關注互連網、分布式、高並發、自動化、軟體團隊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.