当向量需要更多内存并重新定位内存时,指针会发生什么?

Syn*_*max 9 c++ pointers memory-management vector

当vector需要更多内存时,它会在某处重新分配内存,我不知道它在哪里!然后指针变得无效,对此有什么好的解释吗?

我的意思是他们去哪里,我的容器发生了什么?(没有链接列表)

Ker*_* SB 16

简短回答:一切都会好的.不要担心这一点,然后重新开始工作.

中等答案:向向量添加元素或从向量中删除元素会使所有迭代器和引用/指针无效(可能除了从后面删除).就那么简单.在执行此类操作后,请勿引用任何旧迭代器并获取新迭代器.例:

std::vector<int> v = get_vector();

int & a = v[6];
int * b = &v[7];
std::vector<int>::iterator c = v.begin();
std::advance(it, 8);

v.resize(100);
Run Code Online (Sandbox Code Playgroud)

现在a,b并且c都是无效的:您不能使用 a,也不能取消引用 bc.

答案很长:矢量跟踪动态记忆.当内存耗尽时,它会在其他地方分配一个新的,更大的块,并复制(或移动)所有旧元素(然后释放旧内存,销毁旧对象).内存分配和解除分配由分配器(通常std::allocator<T>)完成,分配器通常调用::operator new()获取内存,而后者通常调用内存malloc().细节可能会有所不同,具体取决于您的平 在任何情况下,任何以前保存的引用,指针或迭代器都不再有效(可能是因为它们引用了现在释放的内存,尽管它没有在标准中指定为什么它们无效).

  • 但是......你的意思是"一切都会好的"?我认为OP考虑使用指针,指向矢量数据?我认为只要他满足于这个想法,一切都会好起来的. (5认同)
  • 我仍然觉得"一切都会好"有点误导.:XI认为在"我有指向矢量元素的指针"的背景下,"那很好"并不太好. (5认同)
  • Downvoter,谨慎解释您的反对意见? (4认同)
  • 好吧,我仍然同意downvoter(我认为Macmade是)你应该提到指针会发生什么.或者至少有问题措辞,我宁愿避免说一切都会好.我的意思是,简短的回答是引起关注的唯一部分. (3认同)
  • 从C角度来看,请看一下:https://gist.github.com/1392643当然,它不起作用,以这种方式编码是危险的.但是我认为OP对于向量的使用感到困惑,并且在使用向量时实际上是在询问这样的代码是否正常...... (2认同)

Set*_*gie 5

当您从a中添加或删除项时vector,其中的所有迭代器(和指针)都将失效.如果需要存储指向向量中项目的指针,则创建向量const,或使用其他容器.

向量存储的东西对你来说无关紧要.你不需要做任何事情,只要让它完成它的工作.