C++栈与Map程序运行挂起问题排查
C++程序挂起问题分析
问题根源
这段代码处理右括号时,未检查栈是否为空就直接访问栈顶元素,触发了C++标准中的未定义行为,导致程序在cpp.sh平台挂起。
触发过程
- 输入表达式为
")",属于右括号集合myset,进入右括号处理分支。 - 此时栈
mystack是空的(没有任何左括号被压入过),但代码直接执行了mystack.top()。 - 根据C++规范,对空栈调用
stack::top()是未定义行为——不同环境下可能出现崩溃、挂起、输出异常等情况,在cpp.sh上表现为程序挂起。
修复方法
在访问栈顶元素前,必须先判断栈是否为空:
else if(myset.count(i) == 1) { cout << "Received :: " << i << endl; // 先检查栈是否为空,避免非法访问 if(mystack.empty()) { cout << "Non Balanced" << endl; break; } if(mymap.at(mystack.top()) == i) { cout << " Popped: " << mystack.top() << endl; mystack.pop(); } else { cout << "Non Balanced" << endl; break; } }
内容的提问来源于stack exchange,提问作者Kumar Roshan Mehta
相关产品推荐
相关产品推荐

