【问题标题】:Segmentation fault caused by repeating pop_back() and push_back()重复 pop_back() 和 push_back() 导致的分段错误
【发布时间】:2021-11-25 10:45:16
【问题描述】:

当我使用 c++11 在 Clion(一个 IDE)中运行以下代码时。我遇到了分段错误。但是,如果我删除 if 语句,则在 pop_back 之前添加 else,删除 push_back,或删除 pop_back(分别执行)。不会有错误。那么为什么会出现分段错误以及为什么执行上述任何操作都会消除错误呢?

#include "vector"
using namespace std;

int main() {
    vector<int> test;
    for(int i = 0; i < 10000; i++){
        if(i % 2 == 0)
            test.push_back(i);
        test.pop_back();
    }
}

编辑:有人说这是因为 pop_back 来自空向量,但如果我删除 push_back() 不会有任何问题(即使我在循环之前 push_back 一些元素)。

【问题讨论】:

  • 你 push_back 只用于偶数,但你 pop_back 用于所有。显然,pop_backs 比 push_backs 多。根据std::vector::pop_back在空容器上调用 pop_back 会导致未定义的行为。
  • OT:是&lt;vector&gt; 而不是"vector"
  • 在调试器中单步执行代码会很快提醒您注意这种推送和弹出的不平衡。
  • 尝试将assert(test.size() &gt; 0);放在test.pop_back()之前。
  • @VagenteKing 未定义的行为包括不报告任何问题。

标签: c++ segmentation-fault


【解决方案1】:

当向量为空时,您正在从向量中弹出。在空向量中使用 pop_back() 会导致 未定义的行为,这意味着:

  • 您的程序可能会崩溃
  • 您的程序可能会打印一些废话
  • 您的程序可以正常继续
  • 您的程序可以正常运行,但稍后会出现其他一些看似无关的奇怪行为
  • 或其他一些行为

考虑这段代码:

#include <vector>
#include <iostream>

using namespace std;

int main() {
  vector<int> test;
    
  for (int i = 0; i < 10; i++) {
    if (i % 2 == 0)
      test.push_back(i);

    if (test.empty())
      cout << "stack is empty" << endl;
    else
      test.pop_back();
  }
}

【讨论】:

  • 但是如果我删除 push_back() 并且只有 pop_back(),就不会出现分段错误。程序将正常运行并返回 0。
  • @VagenteKing 未定义的行为包括“显然工作正常”。
  • 后来似乎不相关的行为甚至更早!
猜你喜欢
  • 1970-01-01
  • 2019-03-24
  • 2011-11-22
  • 2011-12-27
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
相关资源
最近更新 更多