我对这件事已经失去理智了。
#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编译的
发布于 2013-05-23 11:00:00
这是由于在第二次push_back
期间vector
增长和重新分配元素造成的。在执行第二次push_back
时,向量可能会发现它的容量已满,并分配一个新的空间,并将元素移动到新的内存中。它还会释放先前分配的内存。由于您存储的是这个已释放内存位置的地址,因此您会看到垃圾值。要解决这个问题,您需要执行a.reserve(2)
,以便在2个整数的push_back期间不会重新分配向量。
发布于 2013-05-23 11:15:35
对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-23 11:00:08
vector
实现了一个动态数组:当你使用push_back
时,这个数组可能会被重新分配--移动到内存中的另一个位置。但是,当a
拥有的数组被移动时,您推入b
的值不会被更新。他们指的是无人区,访问b[0]
会导致未定义的行为。在这种情况下,将读取一个随机值。
https://stackoverflow.com/questions/16712140
复制相似问题