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

LeetCode有效括号题遇AddressSanitizer:DEADLYSIGNAL错误求因

错误成因分析

直接触发原因:栈为空时调用top()方法

代码里的**cout<<c_stack.top();**是引发段错误的核心:

  • 当输入的第一个字符是右括号时,会进入else分支,此时栈c_stack是空的,执行continue跳过当前分支逻辑,但循环结束前会执行这行输出。栈为空时调用top()会访问非法内存地址,直接触发SEGV(段错误),也就是AddressSanitizer提示的内存读取错误。
  • 另外,当遇到不匹配的括号执行break跳出循环时,如果此时栈已经为空,这行输出同样会触发错误。

配套逻辑漏洞

  • 遇到右括号且栈为空时,你用continue跳过,但这种情况本身就是无效括号(比如输入)),应该直接返回false,而不是继续循环,后续操作会持续带来风险。
  • 遇到不匹配的括号时执行break,而非直接返回false,虽然最终判断栈是否为空的结果可能正确,但中间的输出操作已经触发了内存错误。

修复建议

  1. 移除cout<<c_stack.top();这行调试代码,LeetCode判题环境不需要这类输出,反而会引发错误。
  2. 遇到右括号且栈为空时,直接返回false,因为这种情况已经属于无效括号。
  3. 遇到不匹配的括号时,直接返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:10:24