为什么向量中的变量指针保持有效?

时间:2014-06-24 17:15:58

标签: c++ pointers vector

以此代码为例:

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指向垃圾数据。有没有这种情况不会起作用?

2 个答案:

答案 0 :(得分:4)

您实质上是在询问迭代器是否保持有效(尽管,矢量迭代器的类型不一定与简单指针相同)

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

  

如果发生重新分配,则包括所有迭代器,指针和引用   与容器相关的内容无效。否则,只有那些   使用所有迭代器,指向位置和超出位置都是无效的   指向保证保持位置之前的元素的指针和引用   指的是他们在电话会议之前提到的相同要素。

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

答案 1 :(得分:0)

重新分配myVector的内部缓冲区后,b_pointer将指向无效的内存,简单明了。取消引用它将导致未定义的行为。

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