测试过程:
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文件(demo_sphere.stl 和 demo_sphere1.stl),可以分别用这两种方法读取并进行性能测试,以实际验证哪种方法更优。MMF.cpp文件可能是用于实现内存映射文件解析STL的代码。通过运行这个...
在C++中,每个STL容器如`vector`、`list`、`map`等都有自己的分配器,负责内存的申请和释放。 **STL分配器(Allocator)的作用:** 1. **内存管理**:分配器的主要职责是为容器中的元素分配和释放内存。它定义了...
- 尽可能使用STL容器,如std::vector和std::map,它们会自动处理内存管理。 - 对于跨函数使用的内存,使用RAII(Resource Acquisition Is Initialization)设计模式。 - 使用内存池技术来更有效地管理内存,减少碎片...
此外,由于STL已经过广泛测试,使用它可以减少出现错误的可能性,从而降低了调试和维护的成本。 #### 3. 性能优化 STL内部使用了许多高效的算法和技术,比如`std::sort`背后的快速排序算法,这些都是经过优化的,...
6. **空间配置器(Allocator)**:负责内存的分配和释放,提供了定制内存管理的机制。 在实际使用STL时,我们通常会通过`std`命名空间来访问这些组件。例如,定义一个`list<int>`容器,然后使用`copy`算法将容器...
- **实践应用**:通过编写测试代码验证STL的行为和性能。 - **性能优化**:根据源码实现,探索可能的优化路径。 #### 五、核心知识点详解 - **vector**:实现为一个动态数组,内部使用连续内存块存储元素。主要关注...
- **Allocator**:EASTL引入了自己的内存分配器系统,这允许开发者更精细地控制内存分配和释放,以适应游戏开发中的资源限制和性能需求。 - **Pool Allocator**:EASTL支持池分配器,可以减少小对象的内存碎片问题...
- **内存管理**:合理使用new和delete进行动态内存分配和释放,避免内存泄漏。 - **模板类**:STL容器都是模板类,需要理解模板参数的作用并正确使用。 - **异常安全**:遵循异常安全编程原则,确保在异常发生时,...
- **分配器(allocator)**:负责内存的分配和释放,STLport中的内存管理策略允许用户自定义分配器以满足特定需求。 了解并熟练使用STL能够极大地提升C++编程的效率和代码质量。在实际开发中,结合STLport这样的第...
5. 动态内存管理:智能指针如shared_ptr和unique_ptr是STL的一部分,它们自动管理对象的生命周期,避免内存泄漏。在游戏开发中,尤其在处理复杂的对象层次时,智能指针能确保正确地释放资源。 6. 功能对象:STL支持...
7. **内存管理**:由于C语言没有自动的垃圾回收机制,所以这个库可能会有详细的内存分配和释放函数,确保内存的有效使用和避免内存泄漏。 8. **性能优化**:C语言版的STL可能会特别关注性能,通过减少不必要的内存...
在SGI-STL中,空间配置器通常被用于容器类,如vector、list和map,以控制其内部元素的内存分配。 移植SGI-STL的Allocator涉及到以下几个关键步骤: 1. **理解原版Allocator**:首先,你需要深入理解SGI-STL的...
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++标准模板库(STL)中的容器如`std::vector`、`std::list`和`std::map`提供了方便的内存管理。它们内部会自动处理内存分配和释放,但使用不当也可能导致内存问题。 7. **内存泄漏检测** 为了检测和预防内存泄漏...
这对于学习STL的工作原理、优化代码性能以及理解和实现其他容器(如list、set、map等)都是非常有价值的实践。 总之,这个"STL.zip"压缩包为学习和实践C++ STL提供了很好的素材,涵盖了面向对象编程中的模板、容器...
内容简介回到顶部↑这本书不适合C++ 初学者,不适合 Genericity(泛型技术)初学者,或 STL 初学者。这本书也不适合带领你学习面向对象(Object Oriented)技术 — 是的,STL 与面向对象没有太多关连。本书前言清楚...
9. **内存泄漏检测**:为了发现并修复内存泄漏,开发者可以使用内存泄漏检测工具,如Valgrind、LeakSanitizer等,它们可以帮助找到未释放的内存。 10. **优化实践**:实践中,可以采用预分配、复用已释放的内存块、...
- 内存池(memory pool):探讨了如何高效地管理内存分配和释放。 - 特质(trait)机制:介绍了如何通过模板元编程来实现类型特性检测等功能。 #### 四、学习价值 侯捷强调,虽然本书提供了大量的源码细节,但它并不...