假设我有一个std :: vector of structs。如果向量是clear()'d?
,内存会发生什么std::vector<myStruct> vecs;
vecs.resize(10000);
vecs.clear();
是否可以释放内存,或者仍然将vecs变量附加为可重用的缓冲区?
答案 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
方法强制向量释放内存。
答案 4 :(得分:0)
如果我们需要通过释放内存来清除以下内容也可以:
v = std::vector<T>();
它调用 &&
运算符的 =
重载,该运算符执行移动,行为与 swap() 解决方案类似。