如果清空std::map,是否确保内存被释放?

4
如果使用vec.clear()清除std::vector vec,则分配的内存不能立即释放。向量的size将为零,但capacity将保持不变/可以保持不变,这是非常有益的行为,因为可以清除大型向量并为其分配新值,而无需进行昂贵的内存分配/释放。此外,内存将减少碎片化。可以使用vec.shrink_to_fit()shrink_to_fit来强制执行此操作。 std::map具有clear函数,但没有shrink_to_fit。在调用clear后,用于存储地图的所需内存会发生什么情况?
cppreference.com指出map.clear()从容器中删除所有元素。调用此函数后,size()返回零。

树被销毁,所以节点被释放。我想树可能会保留它们,但我认为没有人这样做。 - Matthieu Brucher
节点内存的操作取决于与 Map 一起使用的分配器。任何基于节点的容器都是如此。向量不同,因为需要确保连续性。 - StoryTeller - Unslander Monica
map不将其元素存储在连续的内存中,因此拥有未实际使用的容量几乎没有任何好处。 - 463035818_is_not_a_number
内存分配是一个多级缓冲系统。当内存被清除时,容器可能不会将内存释放给分配器。分配器也可能实现一些缓冲,并且可能不会将内存释放给用户空间内存(libc)管理库,该库也实现了缓冲并且可能不会释放由内核管理的虚拟内存映射,内核可能会在释放之前保留物理内存一段时间。 - Oliv
1个回答

4
可以使用vec.shrink_to_fit()来强制释放内存。实际上,shrink_to_fit并不强制释放内存,它只是允许释放。实现可以选择不释放。如果std::map被清空,不能保证内存已被释放。标准容器仅在销毁时才保证释放其内存。Map没有像vector一样的容量概念,因此不需要shrink_to_fit。clear后的map与clear + shrink_to_fit后的vector处于相同的状态:它不需要分配任何内存...但也不禁止分配。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接