c++矢量内存使用-它是否曾经被释放

C++ Vector Memory Usage - Is it ever freed?

本文关键字:是否 曾经 释放 内存 c++      更新时间:2023-10-16

我知道每当它们的capacity()超过时,向量的大小就会翻倍。这个操作需要一些时间,这就是为什么向量应该有平摊常数时间来使用push_back()添加元素。

  1. 我想知道的是…

  2. 当一个矢量缩小到它的size()小于capacity()的一半时会发生什么?
  3. 向量是否会放弃它们使用的内存,或者它只是在向量被销毁之前就消失了?

如果它们不缩小大小,可能会浪费很多内存,但我从来没有听说过它们有这个功能。

不,它永远不会被释放(即容量永远不会减少),直到销毁。释放内存的一种常用方法是创建一个大小正确的新向量,并使用它:

std::vector<type>(originalVector).swap(originalVector);

(灵感来自"More Exceptional c++ ", Item #7)

如果你想确保你的向量使用尽可能少的空间,你可以说:

std::vector<Foo>(my_vector).swap(my_vector);

您也可以调用shrink_to_fit()成员函数,但这只是一个非绑定请求。

从vector中删除元素甚至完全清除vector并不一定会释放与该元素相关的任何内存。这是因为vector自创建以来的最大大小可以很好地估计该vector未来的大小。

使用收缩以适应习惯用法:

std::vector<int> v;
//v is swapped with its temporary copy, which is capacity optimal
std::vector<int>(v).swap(v);

c++ 0x的解

在c++ 0x中,一些容器声明了函数shrink_to_fit()的习惯用法,例如vector, deque, basic_string。Shrink_to_fit()是一个将capacity()减小到size()的非绑定请求。

它们的大小不会缩小。

取消内存分配通常是没有用的。

例如,vector现在可以收缩,但稍后会再次增长。重新分配额外的内存(并复制内存中的所有元素)只是为了以后重新分配它,这将是一种浪费。

如果一个vector正在收缩,那么该vector也很有可能被收缩为空,然后销毁。在这种情况下,随着内存收缩而释放内存也是浪费时间。

它也可以是一个有用的优化重用vector对象,以避免分配/释放内容。当它收缩时,引入释放会破坏这一点。

基本上,大多数时候释放额外的内存是不值得的。在少数情况下,您可以明确地请求释放。

内存耗尽,直到vector被销毁。