为什么我的C++程序运行到特定位置后就停止继续执行了?
问题原因与修复方案
核心问题
你的程序触发了未定义行为直接崩溃,并非cout语句没有执行,而是崩溃发生在输出内容刷新到控制台之前。
具体错误点
你写的(cnt.end()--)->second=1;存在两个致命问题:
std::map的end()返回的是尾后迭代器,不指向任何有效元素,禁止解引用- 后置
--运算符的返回值是自减前的迭代器值,你写的代码等价于:auto temp = cnt.end(); // 拿到尾后迭代器 (临时迭代器对象)--; // 自减后的临时对象没有被使用 temp->second = 1; // 直接解引用尾后迭代器,触发未定义行为
程序在此处直接崩溃,而前面的cout语句因为没有加endl或者手动调用flush(),输出内容还停留在行缓冲里没有打印到控制台,导致你误以为cout没有执行。
修复方法
如果要修改map最后一个元素的值,正确写法如下,注意要使用前置--:
// 先判断map非空,避免m=0时依然触发非法操作 if (!cnt.empty()) { auto last_iter = --cnt.end(); last_iter->second = 1; }
其他隐含错误
你后续代码里还有两处同类问题需要修复:
- 遍历的初始化语句
auto it=cnt.end()--同样要改为auto it = --cnt.end(),且要先判断map非空 - 判断条件
it!=--cnt.begin()是非法操作:begin()是map起始迭代器,对它做自减也是未定义行为,可以直接使用反向迭代器实现反向遍历逻辑,更安全易读:for (auto it = cnt.rbegin(); it != cnt.rend(); ++it) { if (it->second) { cout << it->first << " "; } }
内容的提问来源于stack exchange,提问作者discovery
相关产品推荐
相关产品推荐

