1

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

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

这是两个父元素的地址:

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

如您所见,地址显然保持不变,但似乎它们指向 push_back 之后的垃圾值。据我了解, push_back 在向量的末尾添加了一个元素。因此,我希望这两个元素的地址根本不会改变。

怎么了?

4

2 回答 2

11

TL;DR 版本:

插入操作可以使任何指向 a 元素的指针、引用或迭代器无效std::vector

完整解释:

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

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

capacity >= size每时每刻。

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


* 这是一个典型的内部实现std::vector

于 2013-03-19T22:30:01.520 回答
2

push_back如果当前分配给元素存储的空间不能包含新元素,则可能导致向量中所有元素的重新分配和移动。

于 2013-03-19T22:30:02.003 回答