MSIPO技术圈 首页 IT技术 查看内容

STL 容器元素减少但内存没有下降且不会自动释放,如何在运行时释放多余内存?【C++】

2024-03-25

STL 容器元素减少但内存没有下降且不会自动释放,如何释放多余内存?

前言

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 原来可能过大的内存布局。当临时对象的生命周期结束时,它会随着其析构过程释放那部分多余的内存。

相关阅读

热门文章

    手机版|MSIPO技术圈 皖ICP备19022944号-2

    Copyright © 2024, msipo.com

    返回顶部