使用向量push_back进行内存分配

时间:2013-03-28 21:30:28

标签: c++ memory vector push-back

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

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

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

2 个答案:

答案 0 :(得分:3)

  

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

所以是时候学习更多有趣的东西:你的代码有未定义的行为,因为使用下标运算符的前提条件是索引小于大小矢量。

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

答案 1 :(得分:0)

  

如果我拨打v[2]我将不会收到细分错误,因为operator[]不会进行边界检查

这两个人没有这样的关系......

您的代码调用未定义的行为,因此它可以执行任何内容。