1. 程式人生 > >使用迭代器的錯誤之一:對迭代器越界值解引用,而且這種情況是發生在判斷條件中,比較隱蔽

使用迭代器的錯誤之一:對迭代器越界值解引用,而且這種情況是發生在判斷條件中,比較隱蔽

問題程式碼

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
void prin_vec (ostream& Out,vector<string>& word_list)
{
    vector<string>::const_iterator i,j;
    i=word_list.begin();
    sort(word_list.begin(),word_list.end());
    while
(i!=word_list.end()) { j=i; while(*j==*i &&j!=word_list.end() ) j++; Out<<(*i )<<" occur "<<j-i<<" times"<<endl; i=j; } } int main() { string s; vector<string> word_list; while(cin>>s) word_list.push_back(s); prin_vec(cout
,word_list); } 注意這個片段

while(*j==*i &&j!=word_list.end() )
j++;

    Out<<(*i )<<" occur "<<j-i<<" times"<<endl;
    i=j;
}
如果j++之後j變為越界值,那麼對J進行解引用會導致執行報錯。
而因為是發生在判斷語句中的,所以可能比較難以察覺。
錯誤程式碼

*j==*i &&j!=word_list.end()


正確程式碼

j!=word_list.end() && *j==*i
“`

也就是變成先檢測j是否是越界值,是就不用解引用,否則解引用。

錯誤警示

當使用迭代器時,先弄一個單獨的判斷是否越界,再在之後的下個if中判斷其他條件。

其他警示

除錯過程中箭頭指向的程式碼段不是正在執行的,而是下一條即將執行的,因此如果指向某條之後再選擇下一條就馬上報錯,則問題出現再某條,而不是下一條。