2014-06-24 156 views
0

拿这个代码,例如:为什么指向变量的指针保持有效?

int a = 1; 
int b = 2; 
int c = 3; 
std::vector<int> myVector; 
myVector.push_back(a); 
myVector.push_back(b); 
myVector.push_back(c); 
int * b_pointer; 
b_pointer = &myVector[1] 

以我的经验b_pointer总是支持点b即使向量可以重新分配应做起来很b_pointer点垃圾数据。有没有这种情况下,这将无法正常工作?

+4

'b_pointer'不指向'b',它指向存储在'my_vector'中的第二个元素。 –

+0

@Captain如果我打电话给'myVector.erase(myVector.begin())','b_pointer still'有效吗? – 0ctoDragon

+0

'迭代器/指针/引用无效'是你正在寻找的东西。如果重新分配,'.push_back()'使指针无效。 – milleniumbug

回答

4

你基本上是问是否一个迭代器保持有效(虽然,矢量迭代器的类型并不一定等同于简单的指针)

std::vector<>::insert文档说

如果重新分配发生时,与容器相关的所有迭代器,指针和引用 都将失效。否则,只有那些指向位置及以后的 被无效,所有迭​​代器, 指针和元素引用才能保证保持 引用它们在调用之前引用的相同元素。

您可能注意到的事情是,当realloc发生时,如果有可用空间,它有时会扩展当前分配。

+3

或者,realloc发生,将整个矢量数据复制到新的位置。旧位置仍然碰巧具有与以前相同的*值*,但并不保证这种方式。 –

0

经过myVector的内部缓冲区重新分配后,b_pointer会指向无效内存,简单明了。解除引用会导致未定义的行为。

但是,它指向的内存很可能仍然包含之前保存的数据;为什么有些人会以某种方式支付捣毁它的代价?无论如何,没有人合法能够访问它。如果在此期间发生足够的分配,它最终会被别的东西覆盖。

相关问题