【发布时间】:2011-02-03 17:48:17
【问题描述】:
假设我有一个对象:
struct Foo
{
int bar_;
Foo(int bar) bar_(bar) {}
};
我有一个包含Foos 的 STL 容器,可能是一个向量,我拿了
// Elsewhere...
vector<Foo> vec;
vec.push_back(Foo(4));
int *p = &(vec[0].bar_)
这是一个糟糕的主意,对吧?
原因是vector 将其元素存储在某个动态分配的数组中,最终,如果您添加足够多的元素,它将不得不分配另一个数组,复制原始数组的所有元素,并删除旧数组。在那之后,p 指向垃圾。这就是为什么vector 上的许多操作会使迭代器无效的原因。
似乎可以合理地假设使容器中的迭代器无效的操作也会使指向容器元素的数据成员的指针无效,并且如果操作不使迭代器无效,这些指针仍然是安全的。然而,许多合理的假设是错误的。这是其中之一吗?
【问题讨论】:
-
@Brian:我认为 Pillsy 在语义上是正确的,如果不是在语法上。