LeetCode有效括号题遇AddressSanitizer:DEADLYSIGNAL错误求因
错误成因分析
直接触发原因:栈为空时调用top()方法
代码里的**cout<<c_stack.top();**是引发段错误的核心:
- 当输入的第一个字符是右括号时,会进入else分支,此时栈
c_stack是空的,执行continue跳过当前分支逻辑,但循环结束前会执行这行输出。栈为空时调用top()会访问非法内存地址,直接触发SEGV(段错误),也就是AddressSanitizer提示的内存读取错误。 - 另外,当遇到不匹配的括号执行
break跳出循环时,如果此时栈已经为空,这行输出同样会触发错误。
配套逻辑漏洞
- 遇到右括号且栈为空时,你用
continue跳过,但这种情况本身就是无效括号(比如输入)),应该直接返回false,而不是继续循环,后续操作会持续带来风险。 - 遇到不匹配的括号时执行
break,而非直接返回false,虽然最终判断栈是否为空的结果可能正确,但中间的输出操作已经触发了内存错误。
修复建议
- 移除
cout<<c_stack.top();这行调试代码,LeetCode判题环境不需要这类输出,反而会引发错误。 - 遇到右括号且栈为空时,直接返回
false,因为这种情况已经属于无效括号。 - 遇到不匹配的括号时,直接返回
false,无需break后再判断。
修复后的示例代码:
class Solution { public: bool isValid(string s) { stack<char> c_stack; const char b10='(', b20='{', b30='['; const char b11=')', b21='}', b31=']'; for(char ch : s) { if(ch == b10 || ch == b20 || ch == b30) { c_stack.push(ch); } else { if(c_stack.empty()) { return false; } char tmp = c_stack.top(); if((tmp == b10 && ch == b11) || (tmp == b20 && ch == b21) || (tmp == b30 && ch == b31)) { c_stack.pop(); } else { return false; } } } return c_stack.empty(); } };
内容的提问来源于stack exchange,提问作者Anurag Yadav
相关产品推荐
相关产品推荐

