C++中std::vector<T*>返回元素的指针稳定性问题
关于std::vector地址稳定性的明确说明
你的理解完全正确,具体拆解如下:
- std::vector承诺的地址稳定性仅针对它自身存储的元素本身——也就是你这个场景里的
T*类型指针。只要vector没有触发重新分配(比如没有执行会导致缓冲区扩容的push_back、resize操作,或者提前用reserve预留了足够空间),这些T*指针在vector堆缓冲区里的存储地址就不会改变,对应的迭代器也会一直有效。 - 至于这些
T*指针指向的对象的地址,和vector的稳定性没有任何关系:- 这些目标对象的内存是由你自己管理的(比如通过
new分配、或是指向栈上变量),它们的地址从分配完成后就固定(除非你主动修改指针指向、或是释放对象)。 - 哪怕vector发生了重新分配,也只是把自身存储的
T*指针拷贝/移动到新的缓冲区里,并不会影响这些指针指向的目标对象的内存地址。
- 这些目标对象的内存是由你自己管理的(比如通过
举个简单的代码示例:
#include <vector> int main() { std::vector<int*> ptr_vec; int* target = new int(100); ptr_vec.push_back(target); // 不触发扩容的情况下,&ptr_vec[0](即vector中存储的target指针的地址)保持稳定 // 而target的值(即它指向的int对象的地址)始终不变,和ptr_vec是否扩容无关 return 0; }
内容的提问来源于stack exchange,提问作者Spring E. Thing
相关产品推荐
相关产品推荐

