2

我一直在想这个。

#include <iostream>
#include <vector>

int main() {

    std::vector<int> a;
    std::vector<int *> b;

    a.push_back(13);
    b.push_back(&a.back());

    a.push_back(24);
    b.push_back(&a.back());

    for (std::vector<int>::iterator it = a.begin(); it != a.end(); ++it)
        std::cout << *it << " ";
    std::cout << "\n";

    for (std::vector<int *>::iterator it = b.begin(); it != b.end(); ++it)
        std::cout << *(*it) << " ";
    std::cout << "\n";

    return 0;
}

输出:

13 24
16712910 24

我真的很想知道,为什么两条输出线都不匹配。我在这里想念什么?我用 gcc 4.6.3 编译了这个

4

5 回答 5

2

这是由于vector在 second 期间元素的增长和重新分配而发生的push_back。当您执行第二个操作push_back时,向量可能会发现其容量已满并分配新空间并将元素移动到新内存中。它还释放先前分配的内存。由于您正在存储此已释放内存位置的地址,因此您会看到垃圾值。为了解决这个问题,您需要这样做a.reserve(2),以便在您的 2 个整数的 push_back 期间不会重新分配向量。

于 2013-05-23T11:00:00.140 回答
1

第二次调用可能(在这种情况下显然会)通过重新分配全部内存来a.push_back()更改第一个元素的地址。a因此&a[0]不再匹配存储的地址b[0]

尝试:

int main() {
  std::vector<int> a;
  a.push_back(13);
  std::cout << &a[0] << endl;
  a.push_back(24);
  std::cout << &a[0] << endl;
  return 0;
}

您很可能会看到不同的值:)

于 2013-05-23T11:15:35.133 回答
0

vector实现一个动态数组:当你 时push_back,数组可能会被重新分配——移动到内存中的另一个位置。但是当拥有的数组被移动时,您推送的值b不会更新。a它们指向无人区,访问b[0]会导致未定义的行为。在这种情况下,读取一个随机值。

于 2013-05-23T11:00:08.463 回答
0

如果重新调整初始 (a) 向量的大小,则 b 中的元素将指向无效值。为了确保它正常工作,我们必须提前知道我们将推入的最大元素 a 并在插入元素之前设置容量。

于 2013-05-23T11:01:24.567 回答
0

当将新元素插入 Vector 并超出其容量时 - 它会重新分配内存,并且所有先前获得的直接引用都会损坏,因为所需的信息不再存在。

于 2013-05-23T11:02:04.783 回答