4.3.5 使用malloc和free动态申请内存
C++允许使用C标准库函数中的malloc()和free()函数申请和释放动态内存,保留这两个函数主要有以下3点考虑。
❑C++程序经常要调用写好的C函数,而在C语言中,只能使用malloc()和free()函数。
❑如果C++程序要运行在C语言环境下,必须使用malloc()和free()函数。
❑new和delete的功能是通过调用malloc()和free()来实现的。
注意
malloc()和free()是C标准库函数,而new和delete是C++的运算符。
malloc()函数的基本调用格式如下所示。
void*malloc(unsigned int size);举例来说,下列语句用于申请一段长度为len,数据类型为short的动态内存。 shortp=(short)malloc(len*sizeof(short));
由于malloc()函数返回类型是void*,用其返回值对其他类型指针进行赋值时,必须使用显式转换。同时,malloc()函数参数是个无符号整数,其仅仅关心申请字节的大小,并不管申请的内存块中存储的数据类型,因此,申请内存的长度须由程序员通过“长度×sizeof(类型)”的方式给出。
说明
使用new和delete申请和释放动态内存时,内存的长度是由编译器自动计算的。
代码4.7 使用malloc()和free()申请和释放动态内存MallocAndFree
<—————————————文件名:example407.cpp——————————————> 01 #include<iostream> 02 int main() 03 { 04 using namespace std; 05 intp=(int)malloc(sizeof(int)*5);//使用malloc申请一块动态内存 06 cout<<"请输入5个整数:"<<endl; 07 for(int i=0;i<5;i++){ 08 cin>>*(p+i); 09 } 10 cout<<"您输入的第3个数是:"<<p[2]<<endl; 11 free(p);//释放所申请的动态内存 12 return 0; 13 }
输出结果如下所示。
请输入5个整数: 1 3 5 7 9(注:键盘输入) 您输入的第3个数是:5
【代码解析】代码第5行,使用malloc()函数动态申请了一块可存放5个int型数据的内存,并用for循环结构对5个数据分别赋值,在使用结束后,不要忘记用free()函数释放所申请的内存。
使用free()函数释放动态内存的基本格式如下所示。
void free(void*p);
其中,p是指向所申请内存块的指针。编译器可以完成由其他类型指针向void型指针的转化,因此直接使用“free(指针);”就可实现内存的释放。与前面介绍的delete一样,程序中应避免释放已经释放了的内存。
注意
如果指针为null,多次释放不会有问题,因为它并不指向任何的内存块。