c++ - 尝试使用堆栈运行代码以获取有效括号问题集时出现 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;
}
};
我不明白这个错误,如果有人为此提供解决方案会非常有帮助
解决方案
考虑一下这个简单的输入会发生什么)
。
您的程序将调用s.top()
一个空堆栈。这是非法操作,可以解释程序崩溃的原因。
您也许应该像这样重写您的代码,以便在调用之前检查堆栈是否为空s.top()
if (!s.empty() && str[i] == s.top())
{
s.pop();
}
else
{
val=false;
break;
}
虽然我没有测试过这个。
推荐阅读
- java - java - 如何使用java中导航组件的安全参数在目的地之间传递数据?
- python - 如何覆盖采购订单中的确认按钮并更新收货 Odoo13 中的需求(操作)?
- sql - 返回下一个季节和年份
- angular - Firefox Highcharts 未显示,但在 Chrome 和 Edge 中一切正常
- html - How to put the icon and the text in the same line
- azure - 在 azure 数据工厂中使用映射数据流展平具有对应值的两个数组
- elasticsearch - 弹性搜索没有从 logstash 获取索引,它可以工作但没有新的提要
- c++ - 逐行读取文件的程序
- reactjs - 带有 esc-bluetooth-printer 插件的 react-native 找不到插件功能
- mitmproxy - 如何在“def request()”中直接返回响应