今天突然遇到vector在使用clear之后,其内存(capacity不变)无法释放的问题:
vector<int> v1{1,2,3};
cout << v1.empty() << endl;
cout << v1[0] << " " << v1.size() << " " << v1.capacity() << endl;
v1.clear();
cout << v1.empty() << endl;
cout << v1[0] << " " << v1.size() << " " << v1.capacity() << endl;
输出结果:
0
1 3 3
1
1 0 3
0 3
可以发现,在使用clear之后,size和empty改变了,但是capacity依旧是那么大(总算是理解C++Primer:vector在生命周期内,内存大小是只增不减)。
这里提供两种释放方法:
第一种:作用域+临时变量+swap函数:swap函数可以直接交换容器的内存
{
std::vector<int>().swap(v1);
}
cout << v1.size() << " " << v1.capacity() << endl;
运行结果:
0 0
第二种:不易发现的成员函数:shrink_to_fit去释放。
v1.shrink_to_fit();
cout << v1.size() << " " << v1.capacity() << endl;
运行结果:
0 0
但是,虽然clear之后vector的内存不会释放,但是重新emplace_back之后的数据,会从容器内存起始地址开始重新存放。