我今天学到了一些有趣的东西:如果我有一个标准向量 v 并且我运行如下代码:
std::vector<float> v;
for (int i = 0; i < 2; i++) v.push_back(2.);
如果我打电话v[2]
,我不会得到分段错误,因为operator[]
不做边界检查。我得到了一些荒谬的小数字,但我很好奇 push_back 的默认行为是什么,以及溢出向量边界我应该期待什么。我认为它必须分配比下一个浮点数更多的空间。多少?这是标准中的,还是特定于编译器的?
我今天学到了一些有趣的东西
所以是时候学习一些更有趣的东西了:你的代码有Undefined Behavior,因为使用下标运算符的前提条件是索引小于向量的大小。
根据 C++11 标准的表 101,表达式a[n]
等价于*(a.begin() + n)
. 由于v.begin() + 2
是指向容器末尾以外位置的迭代器v
,因此取消引用它会导致未定义的行为。
如果我打电话
v[2]
,我不会得到分段错误,因为operator[]
不做边界检查
两人没有这种关系...
您的代码调用未定义的行为,因此它可以做任何事情。