C++动态内存

本文详细探讨了C++中的动态内存管理,包括堆的概念、malloc/free与new/delete的使用、malloc过程的深入理解、内存池的优势以及C++ STL的空间配置器。通过对内存分配和释放的解析,阐述了内存管理的关键问题,如空闲块组织、放置、分割和合并。同时,文章指出内存池技术可以提高内存分配效率并减少内存碎片。
摘要由CSDN通过智能技术生成

1. 堆(heap)

关于操作系统的内存管理的具体内容可以看《深入了解计算机系统》第九章——虚拟存储器。
进程内存分布图如下:
这里写图片描述
动态内存分布主要发生在heap上,对于每个进程,内核维护一个变量brk,指向heap的顶部。访问超过brk的地址,将会发生错误。

那么heap是什么呢?

heap是一组不同大小的块(block)的集合。每个块就是一个连续的虚拟存储器片(chuank),要么是已分配的,要么是空闲的。
以隐式空闲链表来实现堆为例:
块结构
每个块的结构如上图所示,头部、有效荷载和填充。头部说明了块的大小以及是已分配还是空闲。头部以后是malloc请求的有效荷载。那么这样的话,可以讲堆视为一个连续的已分配块和空闲块的序列
这里写图片描述
那么,当malloc申请动态内存时,分配器会寻找一个合适的块来分配出去——这里可能涉及到分割空闲块。如果没有合适的块,那么分配器会调用sbrk函数,向内核请求额外的堆存储器。同时,分配器可能会合并空闲块。具体实现在这个问题里不需要关注,总之所有的方法都是为了处理以下四个问题:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值