首页 > 解决方案 > C++ 标准::向量如果您持有指向指针元素的指针,它会在调整大小时失效吗?

问题描述

假设我创建std::vector<int*> myVec;并保留 100 个条目并用值填充向量,以便所有 100 个元素都有有效的指针。然后我缓存一个指向其中一个元素的指针,

int * x = myVec[60];

然后,如果我附加另一个int *触发调整大小以及由于堆碎片而导致的移动,那么指向指针的前一个指针是否会失效,或者它是否指向内存中的新位置?

如果我的内存服务器是正确的,如果示例std::vector<int> myVecTwo与上述条件相同,并且我存储了一个类似的 ptr

int * x = &myVecTwo[60]; 

并继续追加和调整大小,该指针将无效。

所以,我的问题如下。指向指针的指针会失效吗?由于is_trivially_copyable的新 C++ std 功能以及 std::vector 是否使用此类功能或 POD 检查,我不再确定。

指针会在 C++11 中失效吗?

标签: c++c++11pointersvectordata-structures

解决方案


不。

vector正如您所展示的,在重新分配之后,指向, like元素的指针int * x = &myVecTwo[60];将失效。重新分配后,元素本身会被复制,但元素指针指向的对象不受影响,那么对于int * x = myVec[60];, 重新分配后x仍然指向同一个对象,这与重新分配无关vector


推荐阅读