`
axengine
  • 浏览: 147285 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

STL MAP内存释放测试

map 
阅读更多

测试过程:

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,结论类似。

分享到:
评论

相关推荐

    STL文件的读取(普通文件解析与内存映射文件解析) cpp&stl

    在提供的压缩包中,有两个STL文件(demo_sphere.stl 和 demo_sphere1.stl),可以分别用这两种方法读取并进行性能测试,以实际验证哪种方法更优。MMF.cpp文件可能是用于实现内存映射文件解析STL的代码。通过运行这个...

    stl allocator(stl 分配器)

    在C++中,每个STL容器如`vector`、`list`、`map`等都有自己的分配器,负责内存的申请和释放。 **STL分配器(Allocator)的作用:** 1. **内存管理**:分配器的主要职责是为容器中的元素分配和释放内存。它定义了...

    C++中内存泄露检测工具

    - 尽可能使用STL容器,如std::vector和std::map,它们会自动处理内存管理。 - 对于跨函数使用的内存,使用RAII(Resource Acquisition Is Initialization)设计模式。 - 使用内存池技术来更有效地管理内存,减少碎片...

    c.STL 学习c语言的必看

    此外,由于STL已经过广泛测试,使用它可以减少出现错误的可能性,从而降低了调试和维护的成本。 #### 3. 性能优化 STL内部使用了许多高效的算法和技术,比如`std::sort`背后的快速排序算法,这些都是经过优化的,...

    STL入门,STL基本知识,核心东西

    6. **空间配置器(Allocator)**:负责内存的分配和释放,提供了定制内存管理的机制。 在实际使用STL时,我们通常会通过`std`命名空间来访问这些组件。例如,定义一个`list&lt;int&gt;`容器,然后使用`copy`算法将容器...

    STL源码剖析 中文版

    - **实践应用**:通过编写测试代码验证STL的行为和性能。 - **性能优化**:根据源码实现,探索可能的优化路径。 #### 五、核心知识点详解 - **vector**:实现为一个动态数组,内部使用连续内存块存储元素。主要关注...

    EA(艺电)实现的stl源码

    - **Allocator**:EASTL引入了自己的内存分配器系统,这允许开发者更精细地控制内存分配和释放,以适应游戏开发中的资源限制和性能需求。 - **Pool Allocator**:EASTL支持池分配器,可以减少小对象的内存碎片问题...

    STL源码的仿写

    - **内存管理**:合理使用new和delete进行动态内存分配和释放,避免内存泄漏。 - **模板类**:STL容器都是模板类,需要理解模板参数的作用并正确使用。 - **异常安全**:遵循异常安全编程原则,确保在异常发生时,...

    STL port

    - **分配器(allocator)**:负责内存的分配和释放,STLport中的内存管理策略允许用户自定义分配器以满足特定需求。 了解并熟练使用STL能够极大地提升C++编程的效率和代码质量。在实际开发中,结合STLport这样的第...

    stl c++ 游戏

    5. 动态内存管理:智能指针如shared_ptr和unique_ptr是STL的一部分,它们自动管理对象的生命周期,避免内存泄漏。在游戏开发中,尤其在处理复杂的对象层次时,智能指针能确保正确地释放资源。 6. 功能对象:STL支持...

    C语言版的STL,包含set,list,map等基本数据结构和算法.zip

    7. **内存管理**:由于C语言没有自动的垃圾回收机制,所以这个库可能会有详细的内存分配和释放函数,确保内存的有效使用和避免内存泄漏。 8. **性能优化**:C语言版的STL可能会特别关注性能,通过减少不必要的内存...

    SGI-STL源码移植

    在SGI-STL中,空间配置器通常被用于容器类,如vector、list和map,以控制其内部元素的内存分配。 移植SGI-STL的Allocator涉及到以下几个关键步骤: 1. **理解原版Allocator**:首先,你需要深入理解SGI-STL的...

    STL源码剖析.pdg

    sgi stl 内部文件(sgi stl真正实现于此) 018 1.8.3 sgi stl 的组态设定(configuration) 019 1.9可能令你困惑的c++ 语法 026 1.9.1 stl_config.h 中的各种组态 027 组态3:static template member 027 组态5...

    c++源码 小空间 ,大内存

    C++标准模板库(STL)中的容器如`std::vector`、`std::list`和`std::map`提供了方便的内存管理。它们内部会自动处理内存分配和释放,但使用不当也可能导致内存问题。 7. **内存泄漏检测** 为了检测和预防内存泄漏...

    STL.zip包含vector,deque和丰富的测试用例

    这对于学习STL的工作原理、优化代码性能以及理解和实现其他容器(如list、set、map等)都是非常有价值的实践。 总之,这个"STL.zip"压缩包为学习和实践C++ STL提供了很好的素材,涵盖了面向对象编程中的模板、容器...

    STL 源码剖析(侯捷先生译著)

    内容简介回到顶部↑这本书不适合C++ 初学者,不适合 Genericity(泛型技术)初学者,或 STL 初学者。这本书也不适合带领你学习面向对象(Object Oriented)技术 — 是的,STL 与面向对象没有太多关连。本书前言清楚...

    C++高效内存管理算法

    9. **内存泄漏检测**:为了发现并修复内存泄漏,开发者可以使用内存泄漏检测工具,如Valgrind、LeakSanitizer等,它们可以帮助找到未释放的内存。 10. **优化实践**:实践中,可以采用预分配、复用已释放的内存块、...

    STL源码剖析--侯捷

    - 内存池(memory pool):探讨了如何高效地管理内存分配和释放。 - 特质(trait)机制:介绍了如何通过模板元编程来实现类型特性检测等功能。 #### 四、学习价值 侯捷强调,虽然本书提供了大量的源码细节,但它并不...

Global site tag (gtag.js) - Google Analytics