前幾天剛寫了一篇關於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 關注互連網、分布式、高並發、自動化、軟體團隊