You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何以下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:37:59