尝试使用堆栈运行代码以获取有效括号问题集时出现 AddressSanitizer:DEADLYSIGNAL 错误

新手上路,请多包涵

我在 leetcode.com 上尝试了这个称为有效括号的问题,但出现了一个错误:

 AddressSanitizer:DEADLYSIGNAL
=================================================================
==30==ERROR: AddressSanitizer: SEGV on unknown address (pc 0x0000003783d6 bp 0x7ffe68231e10 sp 0x7ffe68231ca0 T0)
==30==The signal is caused by a READ memory access.
==30==Hint: this fault was caused by a dereference of a high value address (see register values below).  Dissassemble the provided pc to learn which register was used.
    #3 0x7f427121b0b2  (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
AddressSanitizer can not provide additional info.
==30==ABORTING

这是产生错误的代码

#include <stack>

using namespace std;

class Solution {
public:
    bool isValid(string str) {
        stack<char> s;
        bool val=true;
        for(int i=0;i<str.length();i++){
            if(str[i]=='(') s.push(')');
            else if(str[i]=='{') s.push('}');
            else if(str[i]=='[') s.push(']');
            else if(str[i]==')'||str[i]=='}'||str[i]==']'){
                if(str[i]==s.top()) s.pop();
                else if(str[i]!=s.top()) {
                    val=false;
                    break;
                }
            }
        }
        if(s.empty()) val=true;
        else if(!s.empty()) val=false;

        return val;
    }
};

我不明白这个错误,如果有人为此提供解决方案会非常有帮助

原文由 rithnagaraj 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
1 个回答

考虑一下这个简单的输入 ) 会发生什么。

您的程序将在空堆栈上调用 s.top() 。这是非法操作,可以解释程序崩溃的原因。

您或许应该像这样重写您的代码,以便在调用 s.top() 之前检查堆栈是否为空

if (!s.empty() && str[i] == s.top())
{
    s.pop();
}
else
{
    val=false;
    break;
}

虽然我没有测试过这个。

原文由 john 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏