【问题标题】:vector pop_back causing heap-buffer-overflow error向量 pop_back 导致堆缓冲区溢出错误
【发布时间】:2021-10-12 09:04:31
【问题描述】:

我正在尝试制作一个函数来验证括号问题,这个函数在我的机器上运行良好,但是当我调用 "heap-buffer-overflow"强>vector.pop_back()。代码如下:

int isValid(string s){
    vector<char> st;
    for(int i = 0; i < s.length(); i++){
        if(s[i] == '(') st.push_back(s[i]);
        else{
            if(st.back() == '(') st.pop_back(); //this line triggered the error
            else return 0;
                
        }
    }
    return (st.size() == 0);
}

我已经通过将向量更改为字符串来解决这个问题,但我仍然想知道这是怎么发生的,任何解释吗?

【问题讨论】:

    标签: c++ vector data-structures stack


    【解决方案1】:

    在空向量上调用std::vector::back()未定义的行为

    在空容器上回调会导致未定义的行为。

    std::vector::pop() 也是如此,但此时如果容器为空,您的程序已经处于无效状态)。

    因此,代码中的表达式st.back() == '(' 可能会导致程序状态无效,因为容器st 不确定为空。


    你的代码路径需要在调用std::vector::back()之前检查容器的空性;类似:

    if (!st.empty() && st.back() == '(')
      st.pop_back();
    else
      return 0;
    

    注意事项:上面的代码利用了逻辑运算符short circuit evaluation。这意味着如果容器为空,则不会调用第二个操作数(即表达式st.back())。

    【讨论】:

    • 谢谢,这样就解决了,但是我的机器怎么不会出错呢?
    • 从技术上讲,未定义的行为会使您的程序处于未知状态。来自here“未定义的行为 - 程序的行为没有限制。”。我们习惯说“一切都可能发生”(理论上,您的程序甚至可能会擦除您的硬盘驱动器,对其行为不提供任何保证)。在实践中,不同环境(编译器、硬件架构、标准库等)的行为会发生不同的变化。在你的机器上,“坏状态”是不可见的,但无论如何都会出现。
    【解决方案2】:

    可能是因为您在检查 if 条件之前没有在向量中分配任何元素。试试把:

    if(st.size()!=0)
    {
     if(st.back() == '(') st.pop_back(); 
                else return 0;
    }
    

    在那段代码上

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 2021-06-15
      • 1970-01-01
      • 2016-07-27
      • 2017-08-20
      • 2010-11-11
      相关资源
      最近更新 更多