使用迭代器的錯誤之一:對迭代器越界值解引用,而且這種情況是發生在判斷條件中,比較隱蔽
阿新 • • 發佈:2019-01-28
問題程式碼
#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中判斷其他條件。
其他警示
除錯過程中箭頭指向的程式碼段不是正在執行的,而是下一條即將執行的,因此如果指向某條之後再選擇下一條就馬上報錯,則問題出現再某條,而不是下一條。