以此代码为例:
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
指向垃圾数据。有没有这种情况不会起作用?
答案 0 :(得分:4)
您实质上是在询问迭代器是否保持有效(尽管,矢量迭代器的类型不一定与简单指针相同)
std::vector<>::insert
的文档说
如果发生重新分配,则包括所有迭代器,指针和引用 与容器相关的内容无效。否则,只有那些 使用所有迭代器,指向位置和超出位置都是无效的 指向保证保持位置之前的元素的指针和引用 指的是他们在电话会议之前提到的相同要素。
你可能注意到的事情是,当一个realloc发生时,如果有空间,它有时会扩展当前的分配。
答案 1 :(得分:0)
重新分配myVector
的内部缓冲区后,b_pointer
将指向无效的内存,简单明了。取消引用它将导致未定义的行为。
但是,它指向的内存很可能仍然包含它先前保存的数据;为什么有些人会以某种方式支付摧毁它的费用?无论如何,没有人能合法地访问它。如果在此期间发生了足够的分配,它最终会被其他东西覆盖。