c++ - 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 中失效吗?
解决方案
不。
vector
正如您所展示的,在重新分配之后,指向, like元素的指针int * x = &myVecTwo[60];
将失效。重新分配后,元素本身会被复制,但元素指针指向的对象不受影响,那么对于int * x = myVec[60];
, 重新分配后x
仍然指向同一个对象,这与重新分配无关vector
。
推荐阅读
- angular - 使用接口构建 graphql 查询
- sql - 如何从表中选择 * 但在一列上不同并在另一列上排序
- python - 在python中将图片保存在数据集中的自我限制问题
- python - 在 python 中使用 StyleFrame 为文本着色
- android - RecyclerView 在靠近底部时进行网络调用
- asp.net - 回发后列表项消失
- neo4j - 在 Neo4j 中重新加载电影推荐数据集
- flutter - 颤振下拉按钮
- java - Java Apache Http 客户端 - 仅通过 HTTPS 删除标头中的下划线
- angular - Npm 链接:找不到库的模块