例如,如果我做这样的事情:矢量的第一个元素的地址是否固定?
vector<int> myvector;
myvector.push_back(100);
int * ptr = &(myvector[0]);
myvector.clear();
myvector.push_back(10);
将PTR还有效吗?或者现在它可能指向垃圾?
例如,如果我做这样的事情:矢量的第一个元素的地址是否固定?
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
元素还可能违反了过去,一个结束迭代器。
由于是“非失效”,使用后ptr
结果clear
不确定的行为没有这样的事情。
在附注中,不需要&(myvector[0])
中的括号。在C++中,Postfix运算符总是比前缀运算符具有更高的优先级,所以编写&myvector[0]
就好了。
它可能指向垃圾。 vector
当实例增长或缩小时,根据需要重新分配内存,因此不能依赖地址不变。这就是为什么vector
使用的类型必须遵守STL兼容的约束,如可复制性。这也是为什么auto_ptr
在STL容器中不安全的原因。
啊。谢谢,我纠正了。 – wilhelmtell 2012-01-28 17:02:07