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

What does taking address of return from std::vector::operator[] do?

本文关键字:返回 地址 获取 什么 std vector operator      更新时间:2023-10-16

我正在做一些类似的事情:

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中的数据就是垃圾。这让我觉得指针指向一个局部变量。。。但是CCD_ 2返回了一个引用,所以这可能吗?

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

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

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

希望这能有所帮助!