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

C++ AddressSanitizer:尝试使用堆栈运行代码以获取有效括号问题集时出现DEADLYSIGNAL错误,c++,segmentation-fault,address-sanitizer,C++,Segmentation Fault,Address Sanitizer,我在leetcode.com上试图解决一个名为“有效括号”的问题,突然出现一个错误: AddressSanitizer:DEADLYSIGNAL ================================================================= ==30==ERROR: AddressSanitizer: SEGV on unknown address (pc 0x0000003783d6 bp 0x7ffe68231e10 sp 0x7ffe68231ca0 T

我在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;
    }
};
#包括
使用名称空间std;
类解决方案{
公众:
bool是有效的(字符串str){
堆栈s;
布尔值=真;

对于(inti=0;i考虑在这个简单的输入上会发生什么

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

您可能应该像这样重写代码,以便在调用
s.top()


尽管我还没有对此进行测试。

这个问题显示的代码不符合stackoverflow.com对a的要求。这意味着这里的任何人都不可能最终回答这个问题;但最多只能猜测。你应该让你的问题显示一个最小的示例,不超过一到两页的代码(“最小”部分),其他人可以剪切/粘贴、编译、运行和复制所描述的问题(“可复制”部分)(包括任何辅助信息,如程序输入)。有关更多信息,请参阅。
if (!s.empty() && str[i] == s.top())
{
    s.pop();
}
else
{
    val=false;
    break;
}