为什么指向向量中变量的指针仍然有效?

Why do pointers to variables in a vector stay valid?

本文关键字:指针 有效 变量 向量 为什么      更新时间:2023-10-16

以以下代码为例:

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指向垃圾数据。有没有一种情况下,这是行不通的?

实际上是在询问迭代器是否有效(尽管vector迭代器的类型不一定与简单指针相同)

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

如果发生了重新分配,所有的迭代器、指针和引用与容器相关的都无效。否则,只有那些在所有迭代器中,指向position及以后的位置无效,指针和引用的元素之前的位置保证保持指向调用前所指向的相同元素

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

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

然而,它所指向的内存很有可能仍然包含它以前保存的数据;为什么有些人要为丢弃它付出代价呢?反正法律上也没人能拿到。如果在此期间发生了足够的分配,它最终会被其他东西覆盖。