矢量的第一个元素的地址是固定的吗?

时间:2012-01-28 16:44:23

标签: c++ pointers stl vector

例如,如果我这样做:

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

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

2 个答案:

答案 0 :(得分:7)

23.2.3§4说:

  

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

由于没有“取消失效”,因此在ptr之后使用clear会导致未定义的行为。

在旁注中,不需要&(myvector[0])中的括号。 Postfix运算符的优先级始终高于C ++中的前缀运算符,因此编写&myvector[0]就好了。

答案 1 :(得分:3)

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