当我在带有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((,就不会有任何问题(即使我在循环之前推了一些元素(。
当向量为空时,您将从向量中弹出。从空向量中使用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();
}
}