使用迭代器的错误之一:对迭代器越界值解引用,而且这种情况是发生在判断条件中,比较隐蔽
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中判断其他条件。其他警示
调试过程中箭头指向的代码段不是正在执行的,而是下一条即将执行的,因此如果指向某条之后再选择下一条就马上报错,则问题出现再某条,而不是下一条。相关文章推荐
- 刷新共享对象管理器缓存时发生意外错误。System.InvalidOperationException:超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并
- 配置错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的
- 安装 XXX 时出现错误 无法访问windows安装服务。发生这种情况的可能是您在安全模式下运行windows
- 配置错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的
- IIS7及以上错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。
- 配置错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的
- 配置错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(
- Win7 IIS 配置错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的
- 配置错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的
- try catch语句中执行条件判断使用response.end时提示thread abort错误的解决方案
- EasyNetQ使用(九)【非泛型的发布&订阅扩展方法,发生错误的情况 】
- 配置错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(
- IIS7错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny")......
- c++ 很隐蔽的指针访问越界的情况---在强制类型转换中发生
- 配置错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(
- shell中if判断条件中使用[],[[]],(())还是test,let的比较
- Java规则之条件语句中做空判断时使用||和&&常犯的错误
- IIS7错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny")......
- IIS502.**报错配置错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的
- 配置错误 不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况