是固定向量的第一个元素的地址

Is the address of the first element of a vector fixed?

本文关键字:第一个 地址 元素 向量      更新时间:2023-10-16

例如,如果我做这样的事情:

vector<int> myvector;
myvector.push_back(100);
int * ptr = &(myvector[0]);
myvector.clear();
myvector.push_back(10);

ptr仍然有效吗?或者它现在可能指向垃圾?

23.2.3§4规定:

a.clear()[…]使引用a元素的所有引用、指针和迭代器无效,并可能使过去的结束迭代器无效。

由于不存在"取消无效"这回事,在clear之后使用ptr会导致未定义的行为。

附带说明一下,&(myvector[0])中的括号是不需要的。在C++中,后缀运算符总是比前缀运算符具有更高的优先级,所以编写&myvector[0]也没问题。

它可能指向垃圾。当实例增长或收缩时,vector会根据需要重新分配内存,因此您不能依赖地址不变。这就是为什么用于vector的类型必须遵守STL兼容的约束,如复制能力。这也是auto_ptr在STL容器中不安全的原因。

相关文章: