当vector需要更多内存时,它会在某个地方重新分配内存,我不知道它在哪里!然后指针变得无效,对此有什么好的解释吗?
我的意思是他们去哪里,我的容器发生了什么? (不是链接列表)
答案 0 :(得分: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);
现在a
,b
和c
都无效:您无法使用 a
,并且您无法取消引用 b
或c
。
答案很长:该矢量会跟踪动态内存。当内存耗尽时,它会在其他地方分配一个新的,更大的块,并复制(或移动)所有旧元素(然后释放旧内存,销毁旧对象)。内存分配和释放由分配器(通常为std::allocator<T>
)完成,而后者通常会调用::operator new()
来获取内存,而内存通常会调用malloc()
。细节可能会有所不同,具体取决于您的平在任何情况下,任何以前保存的引用,指针或迭代器都不再有效(可能是因为它们引用了现在释放的内存,尽管它没有在标准为什么它们无效的情况下指定)。 / p>
答案 1 :(得分:5)
当您从vector
添加或删除项目时,其中所有项目的所有迭代器(和指针)都将失效。如果需要存储指向向量中项目的指针,请创建向量const
,或使用其他容器。
向量存储内容对你来说无关紧要。你不需要做任何事情,只要让它发挥作用。
答案 2 :(得分:4)
当你使用std::vector
时,该类会处理有关内存分配,指针,调整大小等所有细节。
vector
类通过迭代器和引用公开其内容。向量的变异可能会使迭代器和引用无效,因为可能需要重新分配。
使用指针访问内容是有效的,因为vector
类保证将其元素存储在连续的内存位置。很明显,由于潜在的重新分配,列表的任何变异都可能使其内容的任何指针无效。因此,如果您使用指针访问元素,则在改变向量后必须将这些指针视为无效。简而言之,相同的规则适用于指向内容的指针,就像引用一样。
如果要维护对向量中项目的引用,并且即使在变异后该引用也有效,那么您应该记住索引而不是指针或对项目的引用。在这种情况下,添加到向量的末尾是完全安全的,并且您的索引值仍然引用相同的元素。