【发布时间】: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:是
<vector>而不是"vector" -
在调试器中单步执行代码会很快提醒您注意这种推送和弹出的不平衡。
-
尝试将
assert(test.size() > 0);放在test.pop_back()之前。 -
@VagenteKing 未定义的行为包括不报告任何问题。