C++ STL容器 vector 的工作原理

vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储,类似数组的内存结构。

系统预先给vector容器分配一块 capactity 大小的内存空间,当插入的数据超过这个空间的时候,这块空间会让某种方式扩展,即通过一定倍数大小重新分配空间、拷贝元素、撤销旧空间,在vs下为1.5倍扩容,在linux下为2倍扩容。但是为了防止大量分配连续内存的开销,在使用clear和erase删除数据的时候,它只做了数据清除工作,没有释放内存,所以vector容器的内存是不会缩小的。也就是说,vector容器实现内存自增长,在vector对象不释放的情况下内存只会增长而不会释放,只有当vector对象销毁才会释放这个内存。

如下示例,打印使用clear和erase删除数据前后vector对象的数据容量和内存容量大小

#include <iostream>
#include <vector>using namespace std;int main(void)
{vector<int> vt;for (int i = 0; i < 10; i++){vt.push_back(i);}cout << "size:" << vt.size() << endl;cout << "capacity:" << vt.capacity() << endl;
#if 0vt.clear();
#elsefor (auto item = vt.begin(); item != vt.end(); ){item = vt.erase(item);}
#endifcout << "size:" << vt.size() << endl;cout << "capacity:" << vt.capacity() << endl;system("pause");return 0;
}

使用clear和erase删除数据测试结果入下:

从示例不难看出使用clear和erase无法释放vector容器内存,那对于vector容器,我们应该如何释放呢?

最简单的就是使用 swap()交换函数,使vector离开其自身的作用域,从而强制释放vector所占的内存空间。

template < class T >
void ClearVector( vector< T >& vt )
{vector< T > vtTemp;veTemp.swap( vt );
}

一般的STL内存管理器allocator都是用内存池来管理内存的,所以某个容器申请内存或释放内存都只是影响到内存池的剩余内存量,而不是真的把内存归还给系统。这样做一是为了避免内存碎片,二是提高了内存申请和释放的效率。事实上,vector容器在内存不够时就向内存管理框架申请内存,内存管理框架如果发现内存不够了,就malloc内存,但是当vector释放资源的时候(比如destruct), stl根本就不调用free以减少内存,因为内存分配在stl的底层:stl假定如果你需要更多的资源就代表你以后也可能需要这么多资源(你的list, hashmap也是用这些内存),所以就没必要不停地malloc/free。

注意:这边说到的是系统分配的内存的申请/释放。如果vector中存放的是指针,那么当vector销毁时,这些指针指向的对象不会被销毁,那么内存就不会被释放。开发者自己申请的内存记得自己释放。

C++ vector 内存释放相关推荐

  1. vector 内存释放

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

  2. vector的内存释放

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

  3. c++ vector的内存释放

    c++中vector的一个特点是: 内存空间只会增长,不会减小.即为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都挨着前一个元素存储.设想,如果每次vector添加一个新元素 ...

  4. c++ vector查找_C++ vector内存分配策略浅析

    (给CPP开发者加星标,提升C/C++技能) 来源:邱国禄https://blog.csdn.net/qiuguolu1108/article/details/107146184 vector是一个封 ...

  5. map的内存释放问题

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

  6. C++ vector的释放

    项目上用到vector容器,没有手动释放,总是会在这里出现内存分配不成功的问题,因此对vector的释放了解了一下. 初始代码如下: vector <float*> dets(nTotal ...

  7. C++ vector 内存分配与回收机制

    原文出处:http://blog.csdn.net/qq_30835655/article/details/60762196 最近开始更加深入的学习C++,发现了很多以前没注意到但是很重要的知识点.这 ...

  8. vector内存分配和回收机制

    随着对C++的深入学习,逐渐发现了一些很重要的知识点.本文重点讲解C++ Vector内存机制和效率问题. iOS移动端 记得之前做iOS移动端时,关于垃圾回收机制是这样说的: ARC的基本概念:   ...

  9. vector内存机制和性能分析

    原文出处:http://blog.csdn.net/mfcing/article/details/8746256  不用版本的stl库,动态增长的倍数可能不同,具体进源码里面就一目了然(stl里面的源 ...

最新文章

  1. windows10 计算器无法打开(转)
  2. 随笔:送给初次使用PCL库的小伙伴
  3. 反编译得到的java文件好多错误 val$query什么意思_这部分代码有错么?一直提示输入框$(#msg).val()得到的值未定义...
  4. GDCM:生成标准SOP类的测试程序
  5. 无线打印 airprint 服务器,如何让 Windows 的共享打印机支持 AirPrint
  6. 修改intellij(idea)中mybatis对应的xml背景颜色
  7. Stanford公开课《编译原理》学习笔记(1~4课)
  8. 代码投毒、删库跑路,开源生态链安全该如何保证?
  9. MIT研发“读心机”:不开口也能对话,人生开挂全靠它
  10. 谷歌修复另一枚已遭利用的 Chrome 释放后使用0day,细节未公开
  11. [技巧心得] 嵌套选择器优先级
  12. 圈子论坛社区小程序,交友,博客,社交,陌生人社交,即时聊天 前后端开源PHP
  13. 【detectron】FPN网络输入
  14. iOS 百度地图与高德地图经纬度转换(坐标转换)
  15. APP脱壳之MDEX的使用步骤
  16. 6000字跟你讲清数据运营到底是做什么的?
  17. 从图片到dataframe——语义分割数据集制作全流程
  18. 【Unity2D】制作可以左右移动的平台
  19. java web应用程序开发框架
  20. linux的基本指令--第三节

热门文章

  1. 使用ffmpeg连接音视频
  2. 1.3.4 “解决方案资源管理器”窗口
  3. phpstrom配置连接虚拟机服务器
  4. python大学考试题型这一篇就够了
  5. 2021年2月程序员平均工资出炉!你处于什么水平?
  6. 接口中的方法需要加上 public abstract 修饰吗
  7. 实用网站推荐,每一个都值得收藏
  8. android 高德定位
  9. 用集成显卡刷独立显卡BIOS
  10. 搞笑的中国片英文翻译(摘)