内存管理之堆heap

一、什么是堆?
 堆(heap)是一种内存管理方式。内存管理对操做系统来讲是一件很是复杂的事情,由于首先内存容量很大,
 其次就是内存需求在时间和大小块上没有规律(操做系统上运行着几十甚至几百个进程,这些进程可能随时
 都会申请或者是释放内存,而且申请和释放的内存块大小是随意的)。
 堆这种内存管理方式的特色就是自由(随时申请、随时释放、大小块随意)。堆内存是操做系统划归给堆管
 理器(操做系统中的一段代码,属于操做系统的内存管理单元)来管理的,而后向使用者(用户进程)提供
 API(malloc和free)来使用堆内存。
 
 咱们何时使用堆内存?
 当咱们须要的内存容量比较大时,须要反复使用及释放时,不少数据结构(譬如链表)的实现都要使用堆内存。
 
二、堆管理内存的特色(大块内存、手工分配&使用&释放)
 特色一:容量不限(常规使用的需求容量均可以知足)
 特色二:申请及释放都须要手工运行,手工进行的含义就是须要程序员写代码明确进行申请malloc及释放free。
 若是程序员申请内存并使用后未释放,这段内存就丢失了(在堆管理器的记录中,这段内存仍然属于你这个进程,
 可是进程本身又觉得这段内存已经不用了,因此进程再次运行的时候,就又会去申请新的内存块,这就叫作吃内存),
    称之为内存泄漏。在C/C++语言中,内存泄漏是最严重的程序bug,这也是别人认为Java/C#等语言比C/C++优秀的地方。
三、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接口。
四、堆的优点和劣势(管理大块内存、灵活、容易内存泄漏)
 优点:灵活
 劣势:须要程序员去处理各类细节,因此容易出错,严重依赖于程序员的水平。程序员

相关文章
相关标签/搜索