假设我有一个结构的 std::vector。如果向量是 clear()'d,内存会发生什么?
std::vector<myStruct> vecs;
vecs.resize(10000);
vecs.clear();
内存会被释放,还是仍作为可重用缓冲区附加到 vecs 变量?
假设我有一个结构的 std::vector。如果向量是 clear()'d,内存会发生什么?
std::vector<myStruct> vecs;
vecs.resize(10000);
vecs.clear();
内存会被释放,还是仍作为可重用缓冲区附加到 vecs 变量?
内存仍然连接到向量。这也不仅仅是可能的。这是必需的。特别是,如果您在调用 之后再次向向量添加元素clear()
,则向量不得重新分配,直到您添加的元素数量超过了之前设置的 1000 个元素。
如果要释放内存,通常是与空向量交换。C++11 还添加了一个shrink_to_fit
成员函数,旨在更直接地提供大致相同的功能,但它是非绑定的(换句话说,它可能会释放额外的内存,但仍然不需要这样做)。
向量的内存不能保证被清除。清除后您无法安全地访问元素。为了确保内存被释放,Scott Meyers 建议这样做:
vector<myStruct>().swap( vecs );
Cplusplus.com对此有以下说法:
从向量中删除所有元素,调用它们各自的析构函数,使容器的大小为 0。
向量容量不会改变,并且不会由于调用此函数而发生重新分配。强制重新分配的典型替代方法是使用交换:...
在对象上调用析构函数,但内存仍然分配。
不,内存没有被释放。
在 C++11 中,您可以使用shrink_to_fit
强制向量释放内存的方法。