0

我今天学到了一些有趣的东西:如果我有一个标准向量 v 并且我运行如下代码:

std::vector<float> v;
for (int i = 0; i < 2; i++) v.push_back(2.);

如果我打电话v[2],我不会得到分段错误,因为operator[]不做边界检查。我得到了一些荒谬的小数字,但我很好奇 push_back 的默认行为是什么,以及溢出向量边界我应该期待什么。我认为它必须分配比下一个浮点数更多的空间。多少?这是标准中的,还是特定于编译器的?

4

2 回答 2

3

我今天学到了一些有趣的东西

所以是时候学习一些有趣的东西了:你的代码有Undefined Behavior,因为使用下标运算符的前提条件是索引小于向量的大小。

根据 C++11 标准的表 101,表达式a[n]等价于*(a.begin() + n). 由于v.begin() + 2是指向容器末尾以外位置的迭代器v,因此取消引用它会导致未定义的行为。

于 2013-03-28T21:31:50.593 回答
0

如果我打电话v[2],我不会得到分段错误,因为operator[]不做边界检查

两人没有这种关系...

您的代码调用未定义的行为,因此它可以做任何事情。

于 2013-03-28T21:31:42.333 回答