std::vector 的存储何时自动收缩?

gli*_*10b 5 c++ memory-management vector stdvector

https://en.cppreference.com/w/cpp/container/vector说:

矢量的存储是自动处理的,根据需要扩展和收缩

但我找不到“根据需要”发生收缩的情况。任何收缩操作都不会收缩 std::vector 的容量:

清除()

保持向量的capacity()不变

调整大小()

当调整到更小的尺寸时,向量容量永远不会减少,因为这会使所有迭代器无效

擦除()

在擦除点或擦除点之后使迭代器和引用无效,包括 end() 迭代器。

这意味着擦除点之前的迭代器和引用不会失效,如果容量更改则不会出现这种情况。

pop_back() :

迭代器和对最后一个元素的引用以及 end() 迭代器均无效。

这同样适用于此。

Shrink_to_fit() 确实收缩了 std::vector,但它是在 C++11 中添加的,并且上面的句子(“并且收缩”)没有标记为仅适用于 C++11 及更高版本。此外,对shrink_to_fit()的显式调用不是自动的(“矢量的存储是自动处理的”)并且不会“根据需要”发生。

那么 std::vector 何时自动收缩其存储空间呢?

小智 0

查看libstdc++的源代码后,我没有发现任何释放内存的情况。

看起来该标准为复杂的内存管理实现打开了大门,但众所周知的标准却选择从不这样做。