向量push_back对元素地址的影响

时间:2013-03-19 22:28:02

标签: c++ vector memory-address push-back

我有一个类对象的向量。函数随机选择两个元素并返回它们的地址。

现在使用这两个元素,我想生成同一个类的两个新对象,并使用push_back将它们添加到向量中。

以下是两个父元素的地址:

这里没问题。然后生成第一个子对象,并使用vector_pushback将其添加到向量的末尾。问题是,在执行了push_back命令之后,似乎父对象的地址发生了变化。这是push_back之后的调试器状态:

正如您所看到的,地址显然保持不变,但看起来它们指向push_back之后的垃圾值。据我所知,push_back在向量的末尾添加了一个元素。因此,我希望2个元素的地址根本不会改变。

怎么了?

2 个答案:

答案 0 :(得分:7)

TL; DR版本:

An insertion operation can invalidate any pointers, references or iterators to elements of a std::vector.

完整说明:

std::vector有两个有用的指标:

  • size,这是存储的元素数量。
  • capacity,这是它当前能够存储的元素数量。
始终

capacity >= size

capacity是内部动态分配数组的长度。 * 插入元素时,size增加1.但是一旦达到{{} 1}},必须分配一个新的更大的数组(因此增加capacity)。这需要复制所有元素,并删除原件。所以他们所有的地址都会改变。

<小时/> *这是capacity

的典型内部实现

答案 1 :(得分:2)

如果当前为元素存储分配的空间不能包含新元素,

push_back会导致重新分配和移动向量中的所有元素。