从std::vector::operator[]获取返回地址做什么
What does taking address of return from std::vector::operator[] do?
我正在做一些类似的事情:
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
对象本身的引用与索引一起存储,然后每次查找该索引处的元素。这样,如果向量调整其内部缓冲区的大小,指针就不会变成垃圾,因为每次都要重新索引到向量中。
希望这能有所帮助!
相关文章:
- 返回地址上的WriteProcessMemory
- 在字符串函数的指针中返回地址
- 英特尔 Pin:如何获取系统调用的返回地址
- 如何使用C 给出的地址覆盖汇编器堆栈的返回地址
- 指针不起作用,返回地址不是值
- Linux x64堆栈在信号处理程序内部展开,以修改返回地址
- 如何在函数中获取函数返回地址
- CPP - 使用 * 或 & 返回地址
- 我真的返回地址或参考临时吗?
- 从缓冲区指针计算堆栈中的返回地址
- 堆栈上的线程返回地址是什么
- 运算符 new[] 的返回地址与数组的实际地址之间的差异
- 这些本地函数的返回地址之间有什么区别
- 同时返回地址和值的函数
- 从std::vector::operator[]获取返回地址做什么
- 在返回地址之前清空指针
- 如何找出在 c++ 中更改函数返回地址的原因
- 局部变量的返回地址和程序仍然有效
- 返回地址在C
- 当操作符地址可以设置为普通变量时,为什么要求从函数返回地址?