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

遍历字符串时触发Address Sanitizer错误的原因是什么?

解决「有效的括号」中的Address Sanitizer错误

你的代码触发Address Sanitizer错误的核心原因是:在检查栈是否为空之前,先调用了stack::top()方法。当处理像"]"或者"){"这类测试用例时,栈一开始是空的,直接访问栈顶元素属于未定义行为,会导致内存访问越界。

错误代码的问题点

以测试用例"]"为例,循环第一个字符是']',进入第三个else if分支时,代码先执行q.top() == '[',但此时栈q是空的,top()方法会访问非法内存,直接触发报错。测试用例"){"同理,第一个字符是')'时栈为空,同样会触发内存错误。

修正方案

把!q.empty()的检查放在每个条件判断的最前面,确保只有栈不为空时,才去访问栈顶元素。

修正后的代码如下:

class Solution {
public:
bool isValid(string s) {
    stack<char> q;

    for(auto& ch : s){
        if(!q.empty() && ch == ')' && q.top() == '('){
            q.pop();
        }
        else if(!q.empty() && ch == '}' && q.top() == '{'){
            q.pop();
        }
        else if(!q.empty() && ch == ']' && q.top() == '['){
            q.pop();
        }
        else{
            q.push(ch);
        }
    }
    
    return q.empty();
}
};

额外优化(可选)

你还可以用哈希表简化括号匹配的判断,让代码逻辑更清晰:

class Solution {
public:
bool isValid(string s) {
    stack<char> stk;
    unordered_map<char, char> match = {{')', '('}, {'}', '{'}, {']', '['}};

    for(char ch : s){
        // 处理右括号
        if(match.count(ch)){
            // 栈空或栈顶不匹配,直接返回false
            if(stk.empty() || stk.top() != match[ch]){
                return false;
            }
            stk.pop();
        } else {
            // 左括号直接入栈
            stk.push(ch);
        }
    }
    
    return stk.empty();
}
};

这个版本遇到右括号时,先检查栈状态再判断匹配,不满足条件直接返回结果,避免无效入栈操作,代码可读性更高。

内容的提问来源于stack exchange,提问作者wizzy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:06:19