【问题标题】:Effects of vector pushback on element address矢量后推对元素地址的影响
【发布时间】:2013-03-08 20:23:56
【问题描述】:

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

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

这里是两个父元素的地址:

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

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

怎么了?

【问题讨论】:

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


    【解决方案1】:

    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。但是一旦它达到capacity,一个新的,必须分配更大的数组(因此增加capacity)。这需要复制所有元素,并删除原始元素。所以他们所有的地址都变了。


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

    【讨论】:

    • 哇,我希望有一个 +2 按钮
    【解决方案2】:
    如果当前分配给元素存储的空间不能包含新元素,

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

    【讨论】:

      猜你喜欢
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多