58

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

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

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

4

5 回答 5

67

内存仍然连接到向量。这也不仅仅是可能的。这是必需的。特别是,如果您在调用 之后再次向向量添加元素clear(),则向量不得重新分配,直到您添加的元素数量超过了之前设置的 1000 个元素。

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

于 2012-12-19T03:03:14.740 回答
35

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

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

Cplusplus.com对此有以下说法:

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

向量容量不会改变,并且不会由于调用此函数而发生重新分配。强制重新分配的典型替代方法是使用交换:...

于 2012-12-19T03:03:52.653 回答
10

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

于 2012-12-19T03:02:54.753 回答
6

不,内存没有被释放。

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

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

于 2012-12-19T03:06:40.717 回答
1

.resize(0)并且.clear()不释放或重新分配分配的内存,它们只是将向量的大小调整为零,使容量保持不变。

如果我们需要通过释放(释放)内存来清除以下工作:

在线尝试!

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

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

这种分配技术在运算符&&重载时有效=,并且保证存在于所有 C++11 STD 库中,请参见此处。因此,如果您使用-std=c++11(gcc/clang) 或/std:c++11(msvc) 开关(或更高版本)进行编译,我的解决方案可以保证工作。

于 2021-06-03T10:08:39.570 回答