我正在做类似的事情:
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[]
会返回一个引用,这样可能吗?
答案 0 :(得分:7)
在内部,std::vector
通常维护它包含的元素的动态数组。如果向量的大小变得太大并超过其旧容量,它会分配一个新数组,复制旧元素,然后释放旧数组。因此,对旧数组的任何引用或指针都将变为无效,如果使用,将导致未定义的行为。
如果要将指针存储到向量中,则应确保向量不会最终重新分配其内部缓冲区。您可以等待,直到您在参考之前添加了要添加到向量中的所有元素,或者通过调用vector::reserve
来确保容量足够大。
vector
对象本身的引用与索引一起存储,然后每次在该索引处查找元素。这样,如果向量调整其内部缓冲区的大小,则指针不会变为垃圾,因为每次都会重新索引到向量中。
希望这有帮助!