假设我有一个结构体的std::vector。如果调用clear()函数,内存会发生什么变化?
std::vector<myStruct> vecs;
vecs.resize(10000);
vecs.clear();
这段内存会被释放,还是作为可重用的缓冲区仍然附加到vecs变量上?
假设我有一个结构体的std::vector。如果调用clear()函数,内存会发生什么变化?
std::vector<myStruct> vecs;
vecs.resize(10000);
vecs.clear();
这段内存会被释放,还是作为可重用的缓冲区仍然附加到vecs变量上?
clear()
之后再次向向量添加元素,则在添加的元素数量超过之前的10000时,向量必须不重新分配内存。shrink_to_fit
成员函数,旨在提供类似的功能,但它是非绑定的(换句话说,它可能会释放额外的内存,但并非真正需要这样做)。shrink_to_fit
,它并没有释放GPU或RAM。 - BarzanHayati向量的内存不保证被清除。在清除后,您不能安全地访问元素。为确保内存被释放,Scott Meyers建议执行以下操作:
vector<myStruct>().swap( vecs );
Cplusplus.com对此的解释如下:
清空容器中的所有元素,调用它们各自的析构函数,并将容器的大小设置为0。
向量容量不会改变,也不会因调用此函数而进行重新分配。一种常见的替代方法是使用swap:...
析构函数被调用以释放对象,但内存仍然被分配。
resize(0)
一样好,可能会释放内存的副作用。 - Marcus Müllerresize(0)
保证会保留内存。 - Davis Herringswap()
? - underscore_dswap()
是因为他的书相当古老,那时还没有 &&
右值引用。因为如果没有 &&
赋值运算符重载,我的赋值将无法工作,而这种重载已经存在于所有 STD 库中多年了。&&
在所有 C++11 STD 库中都有保证,请看这里。 - Arty