向量回推对元素地址的影响



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

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

这是两个父元素的地址:

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

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

怎么了?

TL;博士版:

插入操作可以使指向std::vector的所有指针、引用或迭代器失效。

充分说明:

std::vector有两个有用的度量:

  • size,表示存储的元素数。
  • capacity,表示当前能够存储的元素数。

capacity >= size

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


这是std::vector的典型内部实现。

push_back会导致vector容器中所有元素的重新分配和移动,如果当前分配给元素存储的空间不能包含新元素。

最新更新