std :: vector中的内存释放

时间:2013-11-11 01:13:40

标签: c++ c++11 stdvector

我正在试图弄清楚当你删除元素时std :: vector的内存管理是如何工作的。我的理解是,一旦为向量分配了内存,没有pop_back \ erase操作会降低向量的容量,唯一的方法就是使用在C ++ 11中引入的shrink_to_fit。如果我是,请纠正我错误。

1 个答案:

答案 0 :(得分:2)

你是正确的,主要是。

只有几种方法可以降低std::vector的容量......

移动作业

#include <iostream>
#include <vector>

int
main()
{
    std::vector<int> v1(10);
    std::vector<int> v2(20);
    std::cout << "v2.capacity() = " << v2.capacity() << '\n';
    std::cout << "Move assign v2 with less capacity\n";
    v2 = std::move(v1);
    std::cout << "v2.capacity() = " << v2.capacity() << '\n';
}

应输出:

v2.capacity() = 20
Move assign v2 with less capacity
v2.capacity() = 10

如果涉及的分配器以某种方式设置,则不能确保减少的容量。但在如上所示的常见情况下,容量将缩小。如果你真的想知道在移动任务期间容量如何不缩小的细节,请提出另一个问题,我可以详细研究它。

<强> shrink_to_fit

#include <iostream>
#include <vector>

int
main()
{
    std::vector<int> v(20);
    std::cout << "v.capacity() = " << v.capacity() << '\n';
    std::cout << "erasing...\n";
    v.erase(v.begin() + v.size()/2, v.end());
    std::cout << "v.capacity() = " << v.capacity() << '\n';
    std::cout << "shrink_to_fit...\n";
    v.shrink_to_fit();
    std::cout << "v.capacity() = " << v.capacity() << '\n';
}

可能输出:

v.capacity() = 20
erasing...
v.capacity() = 20
shrink_to_fit...
v.capacity() = 10

但允许输出:

v.capacity() = 20
erasing...
v.capacity() = 20
shrink_to_fit...
v.capacity() = 20

<强>交换

#include <iostream>
#include <vector>

int
main()
{
    std::vector<int> v(20);
    std::vector<int> v2(10);
    std::cout << "v.capacity() = " << v.capacity() << '\n';
    std::cout << "swap...\n";
    swap(v, v2);
    std::cout << "v.capacity() = " << v.capacity() << '\n';
}

应输出:

v.capacity() = 20
swap...
v.capacity() = 10

我知道没有其他方法可以缩小vector的容量(除了明显等同的构造,例如v.swap(v2))。

一个好的经验法则是,除非:

,否则向量的容量永远不会缩小
  1. 它使用另一个向量传输资源(例如移动分配或swap)。
  2. shrink_to_fit被召唤。
  3. 哦,我几乎忘记了第三种可能性:无论何时从 vector移动,移动的vector可能会减少容量(或者可能不)。这是未指定的,所以你不能指望它。一般来说,移动值应该是您不关心其当前状态的变量。您随后会破坏它们或为它们分配一个新的已知状态(赋值不必通过赋值运算符;例如clear()可以后跟push_back()