C++:指向向量(及其元素)的指针是不是稳定,因为随着向量的增长,向量将在内存中迁移以适应更多元素? [复制]
Posted
技术标签:
【中文标题】C++:指向向量(及其元素)的指针是不是稳定,因为随着向量的增长,向量将在内存中迁移以适应更多元素? [复制]【英文标题】:C++: Are pointers to vectors (and their elements) stable, since vectors will migrate in memory to fit more elements as they grow? [duplicate]C++:指向向量(及其元素)的指针是否稳定,因为随着向量的增长,向量将在内存中迁移以适应更多元素? [复制] 【发布时间】:2020-11-24 14:02:08 【问题描述】:指向向量的指针应该在向量的生命周期内保持稳定。随着向量增长以容纳更多元素(因此必须将其内容移动到内存中),指向向量中元素的指针可能会发生变化。 IE。矢量的“标题”停留在内存中的位置,内容可能会移动。
我似乎只是凭经验证实了这一点,我只是想确保我的概念是准确的。
测试代码:
std::vector<std::string> vec 21, "Element";
std::vector<std::string> *ptr_v = &vec;
std::string *ptr_el = &vec.at(20);
std::cout << "Before: &vec: " << &vec << " *vec: " <<
ptr_v << " *element 20:" << ptr_el << std::endl;
for(int i = 0; i < 100000; i++)
vec.push_back("Element");
std::vector<std::string> *ptr_v_a = &vec;
std::string *ptr_el_a = &vec.at(20);
std::cout << "After: &vec: " << &vec << " *vec: " <<
ptr_v_a << " *element 20:" << ptr_el_a << std::endl;
enter image description here
【问题讨论】:
概念正确;该标准明确讨论了哪些操作可以使每个标准容器的元素的引用和迭代器无效。见***.com/q/6438086/214671。 最终被Iterator invalidation rules骗了 【参考方案1】:是的,你是对的,向量元素上的指针或迭代器只有在你不对向量执行某些操作时才有效/安全使用。
添加新元素或使用 resize/reserve 可能会导致向量将元素移动到不同的位置,因为它需要更多内存来增大大小。这并不总是发生,当一个向量需要重新分配并将其数据移动到一个新位置时,它实际上分配了比必要更多的内存,以避免每次添加一个新项目时都必须这样做。但你永远不应该依赖这个。更改向量大小后,始终期望指针/迭代器无效。之后访问它们是未定义的行为。出于同样的原因,在通过基于范围的循环的向量时添加/删除元素是一个非常糟糕的主意。
【讨论】:
以上是关于C++:指向向量(及其元素)的指针是不是稳定,因为随着向量的增长,向量将在内存中迁移以适应更多元素? [复制]的主要内容,如果未能解决你的问题,请参考以下文章