有时,程序在运行中需要动态获取内存空间,这种内存需求随着程序运行的进展而时大时小,这种运行中申请的内存就是堆内存,所以堆内存是动态的。堆内存也称动态内存。
堆(heap)是内存空间。堆是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时(而不是在编译时)申请某个大小的内存空间。
使用malloc()函数和new操作符分别是C程序和C++程序中动态申请空间的一种方法。(C++程序在引入头文件后也可使用malloc函数)。
函数malloc()是C程序获得堆内存的一种方法,它在stdlib.h或cstdlib头文件中声明。函数原型为:void *malloc(unsigned int size);
从函数原型可以得知,函数参数为空间大小(单位为字节),返回内容是指向所申请内存的地址。该内存中的内容是未知的。返回类型为void* ,void* 表示未确定类型的指针。因此,在申请空间时要根据实际需求将返回结果强制转换成对应类型。
由于程序并没有保证一定可以从堆中获得所需内存。有时,系统能提供的堆空间不够分配,这时系统会返回一个空指针值NULL,表示申请失败。
程序在运行中可能经常会不再需要由malloc()函数分配的内存,这时就需要使用free()函数把先前所占用的内存释放回堆以供程序的其他部分使用。函数原型为:void free(void *);
实例如下:
#include<iostream> #include<cstdlib> using namespace std; int main(){ int len; cout<<"请输入数组长度: "; cin >> len; int* nums = (int*)malloc(len * sizeof(int)); // 定义指针、申请空间 if(!nums) exit(1); // 判断是否申请到内存空间 for(;len > 0; len --) cout<<( nums[len-1] = len*2+1 )<<(len == 1 ? "\n" : " "); // 赋值并逆序输出 free(nums); // 释放空间 system("pause"); }
new和delete是C++专有的操作符,它们不用头文件声明。new分配堆内存,比malloc()更简练。new的操作数为数据类型,它可以带初始化值表或单元个数。new返回一个具有操作数的数据类型的指针,即表示无需强制转换。delete类似于函数free(),释放堆内存。delete的操作数是new返回的指针,当返还的是new分配的数组时,应该带[]。
#include<iostream> // new和delete无需头文件 using namespace std; int main(){ int len; cout<<"请输入数组长度: "; cin >> len; int* nums = new int [len]; // new分配内存 if(!nums) exit(1); for(;len > 0; len --) cout<<( nums[len-1] = len*2+1 )<<(len == 1 ? "\n" : " "); delete[] nums; // delete释放内存 system("pause"); }