为何以下C++代码的输出结果为b 0?
为什么这段C++代码执行后输出
b 0? 先看这段触发问题的代码:
int main () { std::map<char,int> mymap; std::map<char,int>::iterator it; mymap['a']=10; mymap['b']=20; mymap['c']=30; mymap['d']=40; mymap['e']=50; mymap['f']=60; it=mymap.find('b'); mymap.erase (it); // erasing by iterator std::cout << it->first << " " << it->second << std::endl; mymap.erase ('c'); // erasing by key it=mymap.find ('e'); mymap.erase ( it, mymap.end() ); // erasing by range // show content: for (i... }
咱们来拆解问题的核心原因:
- 当你执行
mymap.erase(it)后,这个迭代器it就直接变成失效迭代器了,它不再指向std::map里的任何有效元素。因为erase已经把它指向的那个('b',20)元素从容器里销毁并移除了。 - 之后你还去访问
it->first和it->second,这属于C标准里明确的未定义行为——也就是说,C标准没有规定这种情况下程序会输出什么,不同编译器、不同运行环境可能给出完全不同的结果:可能输出b 0,可能输出乱码,甚至直接程序崩溃。 - 你看到的
b大概率是原来元素在内存里残留的字符值,0则可能是内存被释放后填充的默认值或者随机垃圾值,但这都不是可预期的结果。
简单说,就是不能在使用erase销毁迭代器指向的元素后,再继续使用这个迭代器——这是C++容器操作里的常见坑点。
内容的提问来源于stack exchange,提问作者SGoodman
相关产品推荐
相关产品推荐

