例如,如果我这样做:
vector<int> myvector;
myvector.push_back(100);
int * ptr = &(myvector[0]);
myvector.clear();
myvector.push_back(10);
ptr仍然有效吗?或者它现在可能指向垃圾?
答案 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容器中不安全的原因。