c++中vector的一个特点是: 内存空间只会增长,不会减小。即为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都挨着前一个元素存储。设想,如果每次vector添加一个新元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能就会非常慢,所以,实际上分配时其容量要比当前所需容量更多,即vector预留了一些额外的存储区,这样就不必单独为每个新元素重新分配内存空间,减少开销。 另外,在vector中内存只增不减体现在 - 比如首先分配了10000个字节,然后erase掉后面9999个,留下一个有效元素,但是实际上内存占用仍然为10000个,所有内存空间是在vector析构的时候才能被系统回收。所以,即使使用clear,vector所占用的内存空间依然如故,无法保证内存的回收。

当然,对于数据量很小的vector,完全没有必要进行主动释放,就比如200 * 200的网格计算,就是没有必要的,但是如果是1000 * 1000,那么就是前者的25倍了,这时就需要进行主动内存释放了。

另外,既然要进行内存释放,我们不得不掌握size()和capacity()方法的区别,前者是实际的vector元素个数,后者是实际占用内存的个数,一般来说,capacity()是大于或等于size()的。

所以,我们可以使用swap()来帮助释放内存,具体方法如下:

#include <iostream>
#include <windows.h>
#include <vector>
using namespace std;
struct GrainRho
{int key;double rho;
};int main() {static vector<struct GrainRho> rhovec;static vector<struct GrainRho>::iterator itrho;GrainRho grainRho;for (int i = 0; i < 100; i++) {grainRho = {i, 0.5 + double(i)};rhovec.push_back(grainRho);}rhovec.clear();cout << "rhovec.size(): " << rhovec.size() << endl;cout << "rhovec.capacity(): " << rhovec.capacity() << endl;vector<struct GrainRho>().swap(rhovec);grainRho = {1995, 6.28};rhovec.push_back(grainRho);cout << "rhovec.size(): " << rhovec.size() << endl;cout << "rhovec.capacity(): " << rhovec.capacity() << endl;system("pause");
}

如上所示,首先我们给这个rhovec存入了很多元素,然后调用clear()函数,但是实际上内存还是没有释放而是继续占用的,所以,我们使用 “vector().swap(rhovec)” 来释放内存,最后又存入一个grainRho,所以最终结果只有一个grainRho占用内存。

最终结果如下所示:

rhovec.size(): 0
rhovec.capacity(): 128
rhovec.size(): 1
rhovec.capacity(): 1

c++ vector的内存释放相关推荐

  1. vector的内存释放

    1. vector容器的内存自增长 与其他容器不同,其内存空间只会增长,不会减小.先来看看"C++ Primer"中怎么说:为了支持快速的随机访问,vector容器的元素以连续方式 ...

  2. vector 内存释放

    vector : C++ STL中的顺序容器,封装数组 1. vector容器的内存自增长 与其他容器不同,其内存空间只会增长,不会减小.先来看看"C++ Primer"中怎么说: ...

  3. C++ vector 内存释放

    C++ STL容器 vector 的工作原理 vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储,类似数组的内存结构. 系统预先给vector容器分配一块 capactity 大小 ...

  4. map的内存释放问题

    map.clear() 只是把map清空了,但是内存没有释放,如果要释放内存不止是要clear()掉,还要和一个空的map来进行swap,将内存释放. 注意map中如果元素不是基本类型,也要进行内存释 ...

  5. 容器内存释放问题(STL新手笔记)

    最近看了下STL,用的过程中有一些体会需要记一下. 容器的空间申请和基本函数操作,以及algorithm等都比较好理解,用起来也很方便,比较关键的是容器元素包含指针时,空间的申请和释放问题,这个觉得S ...

  6. STL中Vector的内存分配机制

    一些好的公司校园招聘过程中(包括笔试.面试环节),经常会涉及到STL中vector的使用(主要是笔试)及其性能(面试)的分析.今天看了下相关文章,也写了几个小的测试程序跑了跑.算是总结下,希望对需要的 ...

  7. 堆积木 vector 清空内存

    问题 蒜头君有 n 块积木,编号分别为 1 到 n.一开始,蒜头把第 i 块积木放在位置 i.蒜头君进行 m 次操作,每次操作,蒜头把位置 b 上的积木整体移动到位置 a 上面.比如 1 位置的积木是 ...

  8. STL容器 内存释放

    在一个项目中,需要在服务端保存玩家的录像回放数据,采用vector/map容器暂存了下发的消息数据,等待游戏结束后就将其写入文件,然后用clear清除掉这块缓存. 游戏上线了之后,发现其占用的内存一直 ...

  9. C++ 中 map 容器的内存释放机制及内存碎片管理

    C++ 中 map 容器的内存释放机制及内存碎片管理 C++ 中的容器很好用,比如 vector, map 等,可以动态扩容,自己管理内存,不用用户关心,但是在某些极端情况下,如果内存比较紧张的情况下 ...

最新文章

  1. 互联网天生本质与产业大局的开始
  2. java dh密钥交换_java-信息安全(八)-迪菲-赫尔曼(DH)密钥交换
  3. 【Spring】JSP 九大内置对象、作用域复习
  4. 跟我学 Java 8 新特性之 Stream 流(五)映射
  5. 硬核!原型和原型链详解
  6. with语句python_Python之with语句
  7. Flutter 使用动画播放一组图片
  8. Apache2.2与Tomcat7集成方案详解
  9. 递归法:杨辉三角,计算第m层的第n个系数
  10. 插件开发之360 DroidPlugin源码分析(三)Binder代理
  11. 【U8+】用友U816.1版本和天高联用,不显示“实施导航”功能模块
  12. UPC10728:Imputation
  13. 百度AI Studio飞桨平台 “深度学习”结课总结
  14. Android应用耗电问题排查
  15. net_device详解
  16. 无人驾驶小车调试笔记(六)-- 车轮校准
  17. 论文研读-多目标优化中的多源选择迁移框架
  18. 1小时等于36000毫秒的计算方法
  19. [RaspberryPi] 一键部署树莓派Zero电子相框功能!
  20. Jerry号召广大程序员同仁们,把身体锻炼好,每天把砖搬起来

热门文章

  1. java between_Java Period between()用法及代码示例
  2. 高清壁纸大全:2013年桌面日历壁纸免费下载
  3. 站在时代风口,AI和区块链哪一个会是大势所趋?文末免费送书哦
  4. [转帖]Cacls和ICacls
  5. r语言与多维统计_Kaukatcr:多维空间语言设计的实验
  6. 信息学奥赛一本通 1294:Charm Bracelet | OpenJudge NOI 2.6 7113:Charm Bracelet | 洛谷 P2871
  7. 任意阶数实数方阵的行列式的值的C语言实现详解
  8. 按键添加震动功能。设置-》应用和通知-》通知-》高级-》勿扰模式立即开启按钮放置界面首行。
  9. window修改处理器类型
  10. 主硬盘影响计算机什么,硬盘分区有哪些影响 硬盘分区会不会影响电脑性能