[DSP编程]

内存管理之堆

[复制链接]
691|2
手机看帖
扫描二维码
随时随地手机跟帖
蒋博1026|  楼主 | 2019-10-22 15:52 | 显示全部楼层 |阅读模式
1、什么是堆?

堆(heap)是一种内存管理方式。内存管理对操作系统来说是一件非常复杂的事情,因为首先内存容量很大,

其次就是内存需求在时间和大小块上没有规律(操作系统上运行着几十甚至几百个进程,这些进程可能随时

都会申请或者是释放内存,并且申请和释放的内存块大小是随意的)。

堆这种内存管理方式的特点就是自由(随时申请、随时释放、大小块随意)。堆内存是操作系统划归给堆管

理器(操作系统中的一段代码,属于操作系统的内存管理单元)来管理的,然后向使用者(用户进程)提供

API(malloc和free)来使用堆内存。


我们什么时候使用堆内存?

当我们需要的内存容量比较大时,需要反复使用及释放时,很多数据结构(譬如链表)的实现都要使用堆内存。


2、堆管理内存的特点(大块内存、手工分配&使用&释放)

特点一:容量不限(常规使用的需求容量都可以满足)

特点二:申请及释放都需要手工运行,手工进行的含义就是需要程序员写代码明确进行申请malloc及释放free。

如果程序员申请内存并使用后未释放,这段内存就丢失了(在堆管理器的记录中,这段内存仍然属于你这个进程,

但是进程自己又以为这段内存已经不用了,所以进程再次运行的时候,就又会去申请新的内存块,这就叫做吃内存),

    称之为内存泄漏。在C/C++语言中,内存泄漏是最严重的程序bug,这也是别人认为Java/C#等语言比C/C++优秀的地方。

3、C语言操作堆内存的接口(malloc free)

    堆内存释放的时候最简单,直接调用free释放即可。  void free(void *ptr);

堆内存申请时,有3个可选择的类似功能的函数:malloc ,calloc, realloc

void *malloc(size_t size);

void *calloc(size_t nmemb, size_t size);     //nmemb个单元,每个单元size字节

void *realloc(void *ptr, size_t size);       //改变原来申请的空间的大小的


譬如要申请10个int元素的内存:

malloc(40);           malloc(10 * sizeof(int));

calloc(10, 4);        calloc(10, sizeof(int));


数组定义时必须同时给出数组元素个数(数组大小),而且一旦定义在无法更改。

堆内存在申请时必须给定大小,然后一旦申请完成大小不变,如果要变只能通过realloc接口。

4、堆的优势和劣势(管理大块内存、灵活、容易内存泄漏)

优势:灵活

劣势:需要程序员去处理各种细节,所以容易出错,严重依赖于程序员的水平。

使用特权

评论回复

相关帖子

zeshoufx| | 2019-10-22 21:30 | 显示全部楼层
谢谢分享,,,,,,,,,

使用特权

评论回复
蒋博1026|  楼主 | 2019-10-24 08:45 | 显示全部楼层
zeshoufx 发表于 2019-10-22 21:30
谢谢分享,,,,,,,,,

我也是发现好多基础都没理解到位,才开始恶补的,从基础开始补

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

323

主题

1827

帖子

18

粉丝