STL 内存释放
C++ STL 中的map,vector等内存释放问题是一个很令开发者头痛的问题,关于
stl内部的内存是自己内部实现的allocator,关于其内部的内存管理本文不做介绍,只是
介绍一下STL内存释放的问题:
记得网上有人说采用Sawp函数可以完全清除STL分配的内存,下面使用一段代码来看看
结果:
首先测试vector:
void TestVector() {
sleep(10);
cout<<"begin vector"<<endl;
size_t size = 10000000;
vector<int> test_vec;
for (size_t i = 0; i < size; ++i) {
test_vec.push_back(i);
}
cout<<"create vector ok"<<endl;
sleep(5);
cout<<"clear vector"<<endl;
// 你觉得clear 它会降低内存吗?
test_vec.clear();
sleep(5);
cout<<"swap vector"<<endl;
{
vector<int> tmp_vec;
// 你觉得swap它会降低内存吗?
test_vec.swap(tmp_vec);
}
sleep(5);
cout<<"end test vector"<<endl;
}
结果显示:调用clear函数完全没有释放vector的内存,调用swap函数将vector的内存释放完毕。
再来看看map:
void TestMap() {
size_t size = 1000000;
map<int, int> test_map;
for (size_t i = 0; i < size; ++i) {
test_map[i] = i;
}
cout<<"create map ok"<<endl;
sleep(5);
cout<<"clear map"<<endl;
// 你觉得clear 它会降低内存吗?
test_map.clear();
sleep(5);
cout<<"swap map"<<endl;
{
// 你觉得swap它会降低内存吗?
map<int,int> tmp_map;
tmp_map.swap(test_map);
}
sleep(5);
cout<<"end test map"<<endl;
}
结果显示:调用clear函数完全没有释放map的内存,调用swap函数也没有释放map的内存。
结论:
上面测试的结果:STL中的clear函数式完全不释放内存的,vector使用swap可以释放内存,map则不可以,貌似而STL保留了这部分内存,下次分配的时候会复用这块内存。
STL 内存释放的更多相关文章
- STL—内存的配置与释放
上一篇我们介绍了STL对象的构造与析构,这篇介绍STL内存的配置与释放. STL有两级空间配置器,默认是使用第二级.第二级空间配置器会在某些情况下去调用第一级空间配置器.空间配置器都是在allocat ...
- STL vector 内存释放
最近在论坛看到一个提问帖子,问题是vector中存储了对象的指针,调用clear后这些指针如何删除? class Test { public: Test() {} ~Test() { cout < ...
- 关于vector的内存释放问题
以前一直想当然的以为vector 的clear()函数会保证释放vector的内存,今天网上一查资料发现完全不是我想象的那样子. 比如有如下代码: tempObject obj1; tempObjec ...
- C++STL内存管理方法(g++版)
STL作为C++的经典作品,一直备受人们关注.本文主要介绍STL的内存管理策略. 早期的STL内存管理 第一次接触STL源码是看侯捷先生的<STL源码剖析>,此书通俗易懂,剖析透彻,是极佳 ...
- STL内存配置器
一.STL内存配置器的总体设计结构 1.两级内存配置器:SGI-STL中设计了两级的内存配置器,主要用于不同大小的内存分配需求,当需要分配的内存大小大于128bytes时, 使用第一级配置器,否则使用 ...
- vector的内存释放
转自:http://www.cnblogs.com/summerRQ/articles/2407974.html vector : C++ STL中的顺序容器,封装数组 1. vector容器的内存自 ...
- STL内存分配
STL内存创建 Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源 1. Stl内存创建基类模板__malloc_alloc_tem ...
- malloc内存分配与free内存释放的原理
malloc内存分配与free内存释放的原理 前段时间一直想看malloc的原理,在搜了好几篇malloc源码后遂放弃,晦涩难懂. 后来室友买了本深入理解计算机系统的书,原来上面有讲malloc的原理 ...
- STL内存管理
1. 概述 STL Allocator是STL的内存管理器,也是最低调的部分之一,你可能使用了3年stl,但却不知其为何物. STL标准如下介绍Allocator the STL includes s ...
随机推荐
- an interview question(2)
感觉现在好多面试题还是很注重基础的,今天面试时就遇到这题,回来一查后才知道此题是国内某著名通信公司的一道机试题:) 给定一个数组input[ ],如果数组长度n为奇数,则将数组中最大的元素放到 out ...
- go并发和并行
Go语言的并发和并行 不知道你有没有注意到一个现象,还是这段代码,如果我跑在两个goroutines里面的话: var quit chan int = make(chan int) func loop ...
- PHP function
- iOS开发 个别页面是否支持页面旋转
- (BOOL)shouldAutorotate { return YES; }
- c语言的continue
continue 是跳过此次循环的剩下部分,直接进入下个循环.
- json_encode 中文乱码
用PHP的json_encode来处理中文的时候, 中文都会被编码, 变成不可读的, 类似"\u***"的格式, 还会在一定程度上增加传输的数据量. 而在PHP5.4, 这个问题终 ...
- Mysql 启动错误:the server quit without updating pid
接到任务看看mysql为啥起不来,就上服务器上看了看,确实起不来,至于之前发生了啥也不知道. 服务器Ubuntu,mysql-5.6 1.先试下mysql登陆 mysql -uroot -p 发现报错 ...
- c#什么时候使用virtual什么时候使用abstract
一.C#中virtual与abstract的区别(引用"姓吕名布字子乔"的文章) C#的virtual & abstract经常让人混淆,这两个限定词都是为了让子类进行重新 ...
- AX2012修改properties字体
参考自http://www.ithao123.cn/wenku/list_310_2.html static void GD_Eric_ChangeUserinfoFont(Args _args){ ...
- Java之流程控制语句
一.Java条件语句(if...else) ifelse语法: 多重if语法: ...