从std :: vector :: operator []获取返回地址是做什么的?

时间:2012-01-25 21:48:30

标签: c++ pointers stl vector

我正在做类似的事情:

struct ABC{
int p,q,r;
};

struct X{
ABC *abc;
X(ABC &abc) : abc(&abc) {}
};

std::vector<ABC> vec;
... //populate vec

X x(vec[2]);

当我调试时,x.abc在赋值后直接看起来正确,但不久之后x.abc中的数据就是垃圾。这让我觉得指针是一个局部变量......但是vector::operator[]会返回一个引用,这样可能吗?

1 个答案:

答案 0 :(得分:7)

在内部,std::vector通常维护它包含的元素的动态数组。如果向量的大小变得太大并超过其旧容量,它会分配一个新数组,复制旧元素,然后释放旧数组。因此,对旧数组的任何引用或指针都将变为无效,如果使用,将导致未定义的行为。

如果要将指针存储到向量中,则应确保向量不会最终重新分配其内部缓冲区。您可以等待,直到您在参考之前添加了要添加到向量中的所有元素,或者通过调用vector::reserve来确保容量足够大。

但是,更好的方法是将vector对象本身的引用与索引一起存储,然后每次在该索引处查找元素。这样,如果向量调整其内部缓冲区的大小,则指针不会变为垃圾,因为每次都会重新索引到向量中。

希望这有帮助!