gpt4 book ai didi

c++ - 从 std::vector::operator[] 获取返回地址有什么作用?

转载 作者:搜寻专家 更新时间:2023-10-31 00:01:56 24 4
gpt4 key购买 nike

我正在做类似的事情:

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[] 返回一个引用,所以这可能吗?

最佳答案

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

如果您想将指针存储到一个 vector 中,您应该确保该 vector 不会最终重新分配其内部缓冲区。您可以通过等到将要添加的所有元素都添加到 vector 后再获取引用,或者通过调用 vector::reserve 来确保容量足够大来执行此操作.

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

希望这对您有所帮助!

关于c++ - 从 std::vector::operator[] 获取返回地址有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9010809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com