SGI STL内存配置器存在内存泄漏吗?
阅读了SGI的源码后对STL很是膜拜,很高质量的源码,从中学到了很多。温故而知新!下文中所有STL如无特殊说明均指SGI版本实现。
STL 内存配置器
STL对内存管理最核心部分我觉得是其将C++对象创建过程分解为构造、析构和内存分配、释放两类操作分离开来!摆脱了对频繁调用new或malloc函数想操作系统申请空间而造成的低效。其中析构操作时对具有non-trival、trival 析构函数的class区别对待也提高了效率。SGI 的两级配置器结构属于锦上添花。
STL内存配置器有没有内存泄漏?
STL两级结构的配置器使得STl能对小的空间内存分配管理更为合理,而很多人有疑问的时这个对小空间的配置器是否存在内存泄漏?“源码面前了无秘密”问题来于源码自,答案也在源码之中。先概述一下STL两级结构的配置器是怎么操作的,STL的Allocator中队内存的申请和释放均是通过其两个静态成员函数完成,allocate,deallocate;对于大于128Byte的内存申请和释放,两个函数均通过调用malloc和free来实现。当内存不大于138Byte时,该allocator会通过一个链表和内存池来维护空间。很多人疑惑为什么在该Allocator的实现里只有对内存池malloc的代码,没看到类似free这样释放内存的代码,甚至该Allocator类都没有析构函数,这样不是会存在内存泄漏吗?其实不然,对于由链表维护的内存,其内存的释放工作应该是上一层调用者负责,比如容器Vector在析构函数中就显示的将其申请的所有capacity大小的内存释放。内存池则不一样,内存池的中的内存将会一直保留知道程序退出。有的同学可能会认为“这不就是内存泄漏吗?比如一个创建了一个Vector变量,到Vector析构了之后再内存中竟然有一块内存没有被系统回收,这不就是内存泄漏吗”,其实不然:
1. 申请的内存没有被及时释放不等于内存泄漏
在单线程中,由于该Allocator中记录内存池起始的指针是静态类型,所以只要是你在同一个线程中,无论你创建多少个Allocator,记录内存池的变量都是同一个,换句话说,当下次再创建Vector时,还是使用上一次使用的那个。
2. 该内存池不会疯狂野生长
这个内存池的空间其实是很小的,因为大于128Byte的内存申请都直接转调了malloc,从源码中也可以看出,内存池每次重新灌水的新容量是2*total_size + round_up(heap_size >> 4)。
内存池的存在是为了避免大量内存碎片的产生,代价是管理内存所需要多付出的时间和空间消耗。
以上就是内存池一种存在直至程序退出的原因。
在GCC 5.4.0 中的使用的SGI已经对该种设计做了大幅修改。1. 默认的Allocator也不在是侯捷一书中说指出的具有内存池的配置器,而是"\usr\include\c++\5\ext\new_allocator.h"其实现直接调用new;2. 而之前相应的具备内存池的配置器则被当做STL的扩展,实现于"\usr\include\c++\5\ext\pool_allocator.h"中,且该实现不在存在内存池的设计,只保留了使用链表将小内存块连接起来的设计(使用时记得include该文件路径,命名空间为__gnu_cxx::__pool_alloc<int> )。
在llvm中Allocator的实现也是直接调用new。
FYI:
GCC更换Allocator设计,http://www.cppblog.com/peakflys/archive/2015/01/14/209513.html
SGI源码,https://www.sgi.com/tech/stl/download.html
SGI源码,allocator,https://www.sgi.com/tech/stl/stl_alloc.h
SGI源码,vector,https://www.sgi.com/tech/stl/stl_vector.h
SGI STL内存配置器存在内存泄漏吗?的更多相关文章
- STL——空间配置器(构造和析构基本工具)
以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作,默默付出.但若以STL的实现角度而言,第一个需要介绍的就是空间配 ...
- STL——空间配置器(SGI-STL)
一. 空间配置器标准接口 参见<STL源码剖析>第二章-2.1.<memory>文件. 二.具备次配置力的SGI空间配置器 1. SGI STL的配置器与众不同,也与标准规范不 ...
- stl空间配置器简介
1. 符合STL标准的空间配器接口 STL是c++中使用非常广泛的一个标准库,它包含各种有用的容器.而空间配置器作为STL各种容器的背后的核心,负责容器内部内存的分配和释放.不过空间配置器可以分配的也 ...
- 【陪你系列】5 千字长文+ 30 张图解 | 陪你手撕 STL 空间配置器源码
大家好,我是小贺. 点赞再看,养成习惯 文章每周持续更新,可以微信搜索「herongwei」第一时间阅读和催更,本文 GitHub https://github.com/rongweihe/MoreT ...
- STL库的内存配置器(allocator)
正在学习中,如果有错,还请多多指教,根据不断的理解,会进行更改,更改之前的样子都会保留下来,记录错误是最大的进步,嗯嗯! 具有次配置力的SGI空间配置器(SGI是STL的一种版本,也有其他的版本) 这 ...
- 自己动手实现STL 01:内存配置器的实现(stl_alloc.h)
一.前言 在STL中,容器是其中的重中之重,基本的STL中的算法,仿函数等都是围绕着容器实现的功能.而,内存配置器,是容器的实现的基础.所以,我第一次要去编写便是内存配置器的实现.在STL中,内存配置 ...
- STL内存配置器
一.STL内存配置器的总体设计结构 1.两级内存配置器:SGI-STL中设计了两级的内存配置器,主要用于不同大小的内存分配需求,当需要分配的内存大小大于128bytes时, 使用第一级配置器,否则使用 ...
- stl空间配置器线程安全问题补充
摘要 在上一篇博客<STL空间配置器那点事>简单介绍了空间配置器的基本实现 两级空间配置器处理,一级相关细节问题,同时简单描述了STL各组件之间的关系以及设计到的设计模式等. 在最后,又关 ...
- 【转】STL空间配置器
STL空间配置器(allocator)在所有容器内部默默工作,负责空间的配置和回收.STL标准为空间配置器定义了标准接口(可见<STL源码剖析>P43).而具体实现细节则由各编译器实现版本 ...
随机推荐
- 一个想法照进现实-《IT连》创业项目:一个转折一个反思
前言: 距离上一篇介绍IT连创业项目的文章,已经过去2个月了,没想到我竟然这么久没写文章向大伙汇报进度了,实在抱歉. 关于这事,我得好好反省,认真检讨,好好写文,哈. 今天主要是讲述一下最近创业的进展 ...
- 微信小程序movable-view移动图片和双指缩放
先从movable-view开始说起吧. movable-view是小程序自定义的组件.其描述为:"可移动的视图容器,在页面中可以拖拽滑动". 官方文档地址:https://mp. ...
- Tornado session 插件 pycket 定制时间和时间续租
功能描述:10分钟用户没有任何操作,跳转到登录页面. 分析:这个功能用session就能实现(由于pycket 的session内容是存储在memcached或者redis里面的.所以,session ...
- LFLiveKit架构简介
LFLiveSession LFLiveSession 是整个sdk的核心,提供对外部的主要接口.主要功能有:管理推流开关.管理音视频录制及渲染.管理录制渲染后的音视频编码.管理编码后的数据上传.管理 ...
- windows 注入 之 SetWindowHookEx
前面的项目用到hook 还是在半年前,没想到最近有用到了,说实话,在项目组就提出,能用别的办法还是不要用这种,毕竟不太正道(感觉哈). 最近又牵扯到第三方对接的任务,没办法我又回到了HOOK上了.与窗 ...
- SDWebImage4.0.0 源码解析
在开发iOS的客户端应用时,经常需要从服务器下载图片,虽然系统提供了下载工具:NSData.NSURLSession等等方法,但是考虑到图片下载过程中,需要考虑的因素比较多,比如:异步下载.图片缓存. ...
- a标签链接到当前页内指定位置
<a name="me">hello</a><br/><br/><br/><br/><br/>& ...
- 实现Echarts折线图的虚实转换
需求:医院的体温单,在统计体温时,对于正常情况下统计的体温数据,需要显示实线:对于进行物理降温后统计的体温数据,需要显示虚线. 现有的体温单是运用 Echarts 折线图,统一用实线显示.因此在这基础 ...
- Linux下自动备份MySQL数据库并上传到远程FTP服务器
Linux下自动备份MySQL数据库并上传到远程FTP服务器且删除指定日期前的备份Shell脚本 说明: 1.备份MySQL数据库存放目录/var/lib/mysql下面的xshelldata数据库 ...
- easyui 时间段校验,开始时间小于结束时间,并且时间间隔不能超过30天
//对easyui datetimebox的验证,开始时间要小于结束时间function validateDateTime(beginTimeId,endTimeId,whichTimeId){ co ...