STL 容器元素减少但内存没有下降且不会自动释放,如何释放多余内存?
- 前言
- 利用 swap 和匿名对象的性质进行收缩内存
前言
C++程序里面我们经常会用到STL容器,容器在运行过程中可能会增长,导致它们分配的内存比实际存储的元素所需的内存要多。在某些情况下,即使在容器减小大小之后,这些容器也不会自动释放多余的内存。这种情况下,可以采用一种巧妙的方式来强制容器减少其占用的内存:通过与一个临时对象交换来收缩内存。
利用 swap 和匿名对象的性质进行收缩内存
这个技巧基于 swap 函数的工作原理。swap 函数会交换两个同类型对象的内容,包括它们的内部状态和占用的内存。通过创建一个临时对象(通常使用当前容器的内容来初始化这个临时对象),然后与原容器进行 swap,可以实现内存收缩的效果。临时对象的作用域结束后,它会被销毁,这时它会释放原容器先前占用的那部分多余内存。
代码演示:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vec(100); // 假设分配了大量内存
vec.resize(10); // 减小大小,但内存可能未减少
// 使用 swap 和匿名对象收缩内存
std::vector<int>(vec).swap(vec);
// 输出 vec 的容量,以证明内存已经收缩
std::cout << "Capacity after shrinking: " << vec.capacity() << std::endl;
return 0;
}
运行结果:
代码说明:
std::vector<int>(vec)
创建了一个临时的 vector 对象,这个临时对象是通过拷贝 vec
的内容来初始化的。紧接着,通过调用 swap
函数,vec
与这个临时对象交换了内容。因为临时对象是以 vec
当前的大小初始化的,所以它没有多余的内存。交换后,vec
拥有了临时对象的内存布局(即没有多余内存),而临时对象则拥有了 vec
原来可能过大的内存布局。当临时对象的生命周期结束时,它会随着其析构过程释放那部分多余的内存。