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