C++ 地址消毒液:DEADLYSIGNAL
当我在leetcode中的以下代码中使用'st.pop'时,出现此错误: 地址消毒液:DEADLYSIGNAL ================================================================= ==31==错误:地址Sanitizer:SEGV位于未知地址pc 0x0000003a1925 bp 0x7ffd7b62dce0 sp 0x7ffd7b62dcd0 T0上 ==31==该信号是由读取内存访问引起的。 ==31==提示:此故障由高值地址的解引用引起。请参阅下面的寄存器值。分解提供的pc以了解使用了哪个寄存器。 8 0x7f3d81a1e0b2/lib/x86_64-linux-gnu/libc.so.6+0x270b2 AddressSanitizer无法提供其他信息。 ==31==中止 代码如下:C++ 地址消毒液:DEADLYSIGNAL,c++,data-structures,stack,queue,C++,Data Structures,Stack,Queue,当我在leetcode中的以下代码中使用'st.pop'时,出现此错误: 地址消毒液:DEADLYSIGNAL ================================================================= ==31==错误:地址Sanitizer:SEGV位于未知地址pc 0x0000003a1925 bp 0x7ffd7b62dce0 sp 0x7ffd7b62dcd0 T0上 ==31==该信号是由读取内存访问引起的。 ==31==提示:此故障由高值地址
class Solution {
public:
string removeOuterParentheses(string S) {
stack<char> st;
int count=0;
string ns;
for(int i=0;i<S.size();i++)
{
if(S[i] == 40 && count++ > 0)
{
st.push(S[i]);
ns+=S[i];
}
if(S[i] == 41 && count-- > 0)
{
st.pop();
ns+=S[i];
}
}
return ns;
}
};
如果您有一个输入字符串,那么您的条件S[i]==40&&count++>0将始终计算为false。当S[i]==为真时,则计数+++>0为假,因为计数在比较后增加。但是,计数会增加,因此第二个条件S[i]=&&count->0最终将为真。然后你打了圣波普。由于st为空,因此将导致问题
此外,如果您修复了代码,例如,通过编写S[i]==40&&&++count>0,它不会像名称所示删除括号。如果您有一个输入字符串,则您的条件S[i]==40&&&count++>0将始终计算为false。当S[i]==为真时,则计数+++>0为假,因为计数在比较后增加。但是,计数会增加,因此第二个条件S[i]=&&count->0最终将为真。然后你打了圣波普。由于st为空,因此将导致问题
此外,如果您修复了代码,例如,通过编写S[i]==40&&&++count>0,它将不会像名称所示删除括号。感谢您的帮助。它试图弹出一个空堆栈 错误-如果[i]==41&&count->0
更正-如果[i]==41&&count->1谢谢您的帮助。它试图弹出一个空堆栈 错误-如果[i]==41&&count->0
更正-ifS[i]==41&&count->1我猜调用st.pop时堆栈是空的。您可以通过添加一些代码行轻松地检查这一点。并显示调用RemoveOuterParenteSF的代码。首先,不要使用幻数。如果要查看某个字符是否为,请使用S[i]==。第二,如果弹出时堆栈为空会发生什么?看看如果输入为40、41会发生什么。count是递增的,但是在第一次迭代时堆栈中没有任何内容被推入,…@Damien,我故意不在第一次迭代中推入括号,因为我正在处理这个问题-删除最外层的括号。我猜调用st.pop时堆栈是空的。您可以通过添加一些代码行轻松地检查这一点。并显示调用RemoveOuterParenteSF的代码。首先,不要使用幻数。如果要查看某个字符是否为,请使用S[i]==。第二,如果弹出时堆栈为空会发生什么?看看如果输入为40、41会发生什么。计数是递增的,但在第一次迭代时堆栈中没有推送任何内容,…@Damien,我故意不在第一次迭代时推送括号,因为我正在处理这个问题-删除最外层的括号。