c++ 清除时是否释放std::vector内存?

7eumitmz  于 2023-11-19  发布在  其他
关注(0)|答案(5)|浏览(136)

假设我有一个std::vector的结构体。如果vector被clear()'d,内存会发生什么?

std::vector<myStruct> vecs;
vecs.resize(10000);
vecs.clear();

字符串
内存会被释放,还是仍然作为可重用的缓冲区附加到vecs变量上?

cgyqldqp

cgyqldqp1#

内存仍然连接到vector上。这也不太可能。这是必需的。特别是,如果你在调用clear()后再次向vector添加元素,那么vector必须在添加的元素超过之前的10000个之前才能重新分配。
如果你想释放内存,通常的方法是用一个空的vector进行交换。C++11还添加了一个shrink_to_fit成员函数,它旨在更直接地提供大致相同的功能,但它是非绑定的(换句话说,它可能会释放额外的内存,但仍然不需要这样做)。

t8e9dugd

t8e9dugd2#

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

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

字符串
Cplusplus.com对此有如下看法:
从vector中删除所有元素,调用它们各自的析构函数,使容器的大小为0。
向量容量不会改变,也不会因为调用此函数而发生重新分配。强制重新分配的典型替代方法是使用swap:.

s1ag04yj

s1ag04yj3#

对对象调用析构函数,但内存保持分配状态。

2guxujil

2guxujil4#

不,内存没有被释放。
在C++11中,可以使用shrink_to_fit方法强制vector释放内存。
http://www.cplusplus.com/reference/vector/vector/

neskvpey

neskvpey5#

.resize(0).clear()不会释放或重新分配已分配的内存,它们只是将vector大小调整为零,而容量保持不变。
如果我们需要清除释放(释放)内存以下工作:
Try it online!

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

字符串
它调用=操作符的&&重载,该操作符执行移动,类似于swap()解决方案的行为。
这种赋值技术在=操作符的&&重载时有效,并且它保证存在于所有C++11 STD库see here中。因此,如果您使用-std=c++11(gcc/clang)或/std:c++11(msvc)开关(或更高版本)编译,我的解决方案保证有效。

相关问题