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,也不能取消引用 b或c.
答案很长:矢量跟踪动态记忆.当内存耗尽时,它会在其他地方分配一个新的,更大的块,并复制(或移动)所有旧元素(然后释放旧内存,销毁旧对象).内存分配和解除分配由分配器(通常std::allocator<T>)完成,分配器通常调用::operator new()获取内存,而后者通常调用内存malloc().细节可能会有所不同,具体取决于您的平 在任何情况下,任何以前保存的引用,指针或迭代器都不再有效(可能是因为它们引用了现在释放的内存,尽管它没有在标准中指定为什么它们无效).
当您从a中添加或删除项时vector,其中的所有迭代器(和指针)都将失效.如果需要存储指向向量中项目的指针,则创建向量const,或使用其他容器.
向量存储的东西对你来说无关紧要.你不需要做任何事情,只要让它完成它的工作.