您的位置:首页 > 其它

使用迭代器的错误之一:对迭代器越界值解引用,而且这种情况是发生在判断条件中,比较隐蔽

2017-11-30 00:36 330 查看

问题代码

#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中判断其他条件。

其他警示

调试过程中箭头指向的代码段不是正在执行的,而是下一条即将执行的,因此如果指向某条之后再选择下一条就马上报错,则问题出现再某条,而不是下一条。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  迭代器
相关文章推荐