c++ map容器的内存回收

在项目中,使用c++ map容器在内存的堆上管理追踪目标的特征库;map容器的内存回收问题记录。

1、map、set、unordered_map、list、deque类
该类容器调用clear(), swap()都无法使得内存真正释放!
调用clear()后,会把容器中所有元素清除(size变成0)、同时被删除元素对应的内存给到内存池memory pool(memory pool用于管理小片段内存/内存碎片并做次级内存分配,clear的时候内存会交还给memory pool而不会真正释放给系统OS)。
调用earse()时的内存操作同clear();
该类容器,会在某一时刻(通常为作用域结束后),通过析构函数自动回收其内存。
2、vector 、string类
该类具有reserve()/capacity() 成员函数,可以利用swap()、shrink_to_fit()等函数来释放空间。
代码1 使用swap()释放vector内存

#include 
using namespace std;

int main()
{
	vector<int> vec;
	for (int i = 0; i < 1000; ++i)
	{
		vec.push_back(1)
	}

	vector<int>().swap(vec);  //通过swap()函数,直接清空vec容器、并回收内存。

	return 0;
}

代码2 使用shrink_to_fit()释放vector内存

#include 
using namespace std;

int main()
{
	vector<int> vec;
	for (int i = 0; i < 1000; ++i)
	{
		vec.push_back(i)
	}

	for(vector<int>::iterator::iter=vec.begin(); iter!=vec.end();) //使用迭代器遍历vec
	{
		if((*iter)=999){
			iter=	vec.erase(iter);  //vector的erase()函数调用后,指向下一个位置
			shrink_to_fit();    //调用shrink_to_fit()函数后,vec内存从capacity大小收缩至size大小。
		}
		else{
			++ iter;
		}
	}
	return 0;
}

3、假如非要第一时间就释放map容器的内存
malloc_trim
linux平台的函数,官方的解释是:从堆释放可用内存。
在程序中堆上new或者malloc的内存我们都会delete和free掉,由于linux的机制它们并没有立即将释放的内存归还给操作系统,这个也是正常的不用担心,因为linux会充分利用内存提高系统的性能。正常情况下我们也不会调用这个函数,只要正常调用了delete和free就可以了。但是如果你内存不够,或者某个操作占用了太高的内存,之后又很少用到这么多内存,你可以调用这个函数释放一下可用内存。
SetProcessWorkingSetSize
windows平台的函数,设置指定进程的最小和最大工作集大小。
当后面两个参数等于-1时,它可以将暂时不使用的内存交换到虚拟内存中(也就是页文件),当需要的时候再从虚拟内存加载到内存中,所以它实际上并没有释放内存,只是在虚拟内存和内存之间进行交换,频繁调用这个函数会降低程序的性能。但是毕竟可以减少内存占用,在关键时间点调用还是很有帮助的,如:程序第一次启动完成之后;

malloc_trim调用代码如下

#include 
#include 
#include 

using namespace cv;
using namespace std;

int main(void)
{
	map<int, shared_ptr<Mat>> m;

	for (int i = 0; i < 1000; ++i)
	{
		const char* imagename = "D:\\Code\\test\\image\\t\\bb.png";

		Mat img = imread(imagename);
		shared_ptr<Mat> p = make_shared<Mat>(img);
		m.insert(pair<int, shared_ptr<Mat>>(i, p));
	}
	
	for (int i = 0; i < 1000; ++i)
	{
		m.erase(i);
		malloc_trim(0);	// 0 is for heap memory  ,调用该函数后,内存碎片被清理,内存第一时间被回收。
	}

	cvWaitKey(0);

	return 0;
}

参考链接:
C++STL中map内存彻底释放方法
为什么调用 std::map::clear() 后内存占用率没有降低?
C++ 中 map 容器的内存释放机制及内存碎片管理
malloc_trim和SetProcessWorkingSetSize两个神奇的内存相关函数

你可能感兴趣的:(c/c++语言,linux系统使用,c++,算法,开发语言)