std :: vector内存是否清除了?

时间:2012-12-19 03:00:47

标签: c++ memory vector

假设我有一个std :: vector of structs。如果向量是clear()'d?

,内存会发生什么
std::vector<myStruct> vecs;
vecs.resize(10000);
vecs.clear();

是否可以释放内存,或者仍然将vecs变量附加为可重用的缓冲区?

5 个答案:

答案 0 :(得分:50)

内存仍然附着在矢量上。如果你想释放它,通常是用空向量交换。 C ++ 11还添加了一个shrink_to_fit成员函数,旨在更直接地提供大致相同的功能,但它不具有绑定性(换句话说,它可能会释放额外的内存,但仍然不是真正需要这样做的)。

答案 1 :(得分:27)

无法保证向量的内存被清除。清除后,您无法安全地访问元素。为了确保内存被释放,Scott Meyers建议这样做:

vector<myStruct>().swap( vecs );

Cplusplus.com对此有以下说法:

  

从向量中移除所有元素,调用它们各自的元素   析构函数,使容器的大小为0。

     

矢量容量不会改变,也不会发生重新分配   调用此函数。强迫a的典型替代方案   重新分配是使用swap:...

答案 2 :(得分:7)

在对象上调用析构函数,但内存仍然被分配。

答案 3 :(得分:4)

不,内存没有被释放。

在C ++ 11中,您可以使用shrink_to_fit方法强制向量释放内存。

http://www.cplusplus.com/reference/vector/vector/

答案 4 :(得分:0)

如果我们需要通过释放内存来清除以下内容也可以:

Try it online!

v = std::vector<T>();

它调用 && 运算符的 = 重载,该运算符执行移动,行为与 swap() 解决方案类似。