1.堆的简介
有栈对于面向过程的程序设计还远远不够,因为栈上的数据在函数返回的时候就会被释放掉,所以无法将数据传递至函数外部。而全局变量没有办法动态地产生,只能在编译的时候定义,有很多情况下缺乏表现力。在这种情况下,堆(Heap)是唯一的选择。
堆是一块巨大的内存空间,常常占据整个虚拟空间的绝大部分。在这片空间里,程序可以请求一块连续内存,并自由地使用,这块内存在程序主动放弃之前都会一直保持有效。
2.什么时候创建堆
(1)malloc函数
例:int*p;
p=(int*)malloc(sizeof(int));
使用malloc函数分配内存时,返回值要经过类型转换才可赋予一个指针变量。该函数如分配内存成功,则返回其始地址,否则返回NULL。头文件为#include<stdlib.h>。
(2)new运算符
例:int*p,*q;
p=new int;//申请分配一个int型内存空间
p=new int(10);//申请一个int型空间存放10
q=new int[10];//申请分配10个int型的内存空间
new分配内存时不需要类型转换。用new申请的空间必须要用delete释放。而且指针值不能改变。形式有:delete指针变量名(可释放一个内存单元)、delete[]指针变量名(可释放若干个内存单元)。
3.堆的管理
运行库相当于是向操作系统“批发”了一块较大的堆空间,然后“零售”给程序用。当全部“售完”或程序有大量的内存需求时,再根据实际需求向操作系统“进货”。当然运行库在向程序零售堆空间时,必须管理它批发来的堆空间,不能把同一块地址出售两次,导致地址的冲突。于是运行库需要一个算法来管理堆空间,这个算法就是堆的分配算法。