当矢量需要更多的内存时,它将重新分配内存,我不知道在哪里!然后指针变得无效,这有什么好的解释吗?
我的意思是他们去哪里,我的集装箱怎么样? (不是链表)
解决方法
简短的答案:一切都会好的.不用担心,重新上班.
中等答案:向矢量添加元素或从矢量中删除元素使所有迭代器和引用/指针无效(可能除了从后面移除).就那么简单.在这样的操作之后,不要引用任何旧的迭代器并获得新的迭代器.例:
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().细节可能有所不同,取决于您的平台.无论如何,任何先前持有的引用,指针或迭代器都不再有效(可能是因为它们引用了现在释放的内存,尽管在标准中没有指定它们是无效的).