欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STL MAP内存释放测试

程序员文章站 2022-03-10 21:00:45
...

测试过程:

insert采用malloc分配内存,释放时采用free释放内存,并erase操作子。使用top窗口查看程序使用的内存。

测试结果:

free后,操作系统为程序分配的内存并不会free掉,而被Hold了。当再次调用insert入map,会使用未free掉的内存。

如果后面insert同样采用malloc分配内存,操作系统会优先使用先去malloc且free掉的内存,若不够再malloc新内存。

测试代码如下:

 

#include <iostream>
#include <map>
#include <ext/hash_map>
using namespace std;
using namespace __gnu_cxx;
#pragma pack(1)
typedef struct
{
	uint32_t	uiUserId;					//Systematic distribution id for every  UserPhone;
	uint8_t		ucFlag;						//first send flag:0,no send;1,send
	uint8_t		ucAlter;					//user can send msg:0,no;1,yes
	char		szUserPhone[14];			//user phone number
	uint32_t	uiLastestBscID;				
	uint32_t	uiLastestAreaID;
	time_t		uiMonthBeginTime;			//cur month send num begin time
	time_t		uiLastestSendTime;			//last send welcome sms time
	time_t		uiFirstSendTime;			//first send welcome sms time
	uint16_t	usDaySendNum;				//send count every day
	uint16_t	usMonthSendNum;				//send count every month
	uint16_t	usTotal;					//send total count	
	uint32_t	uiAreaList[5];	
}CUserInFile;
#pragma pack()
#define LEN sizeof(CUserInFile)
typedef map<int,CUserInFile*> UserMap;
UserMap userMap;
int main()
{
	FILE *fp;
	char buff[LEN];
	int i=0;
	fp=fopen("userprofile_wifi","r");
	memset(buff,0x00,LEN);
	while(fread(buff,1,LEN,fp)==LEN)
	{
		fseek(fp,SEEK_CUR,LEN);
		//fwrite(buff,LEN,10,fpw);
		CUserInFile* pUser=(CUserInFile*)malloc(LEN);
		userMap.insert(make_pair(i++,pUser));
	}
	fclose(fp);
	//fclose(fpw);
	printf("insert ok:%d\n",i);
	getchar();
	UserMap::iterator it;
	for(it=userMap.begin();it!=userMap.end();++it)
	{
		if(it->second==NULL)
		{
			printf("dasdsadas\n");
			continue;
		}
		CUserInFile* pUser=it->second;
		free(pUser);
		userMap.erase(it);
	}
	printf("free ok\n");
	getchar();
	fp=fopen("userprofile_wifi","r");
	memset(buff,0x00,LEN);
	while(fread(buff,1,LEN,fp))
	{
		fseek(fp,SEEK_CUR,LEN);
		CUserInFile* pUser=(CUserInFile*)malloc(LEN);
		userMap.insert(make_pair(i++,pUser));
	}
	fclose(fp);
	printf("insert again ok\n");
	getchar();
	return 0;
}

 后面测试了HASH_MAP,结论类似。

相关标签: map