一、前言
在C语言中使用malloc、free动态分配以及释放内存,相对应的,在C++中使用new、delete动态分配和释放内存(C++中为了兼用C语法,所以保留malloc和free的使用,但建议尽量使用new和delete)。
二、malloc、free的用法
在C语言中使用malloc和free需要加入stdlib.h头文件,两个函数的原型是:
void *malloc(size_t size);
void free(void *pointer);
使用举例:
int *p=(int *)malloc(64); //指向整型的指针p指向大小为64字节的内存的地址
int *p=(int *)malloc(4*sizeof(int)); //指向整型的指针p指向4个int整型空间的地址
通过上面的函数原型可知,malloc()函数的返回值类型为void *,如果赋值给int * 类型的指针,需要在malloc函数前进行强制类型转换。
一般在使用之前需要验证:
if(p==NULL)
printf("内存分配错误!\n");
用完之后需要进行内存释放:
free(p);
有关void*的用法,详见这里。
三、new、delete的用法
使用举例:
int *p = new int; //创建了一个整形对象 返回指向该内存的首地址
int *p = new int();//和上面相同 只使将下指向的整形变量的值初始化为0
int *p = new int(1);//初始为1
delete需要配合new使用,以防止内存泄露:
delete p;
此时p仍然是个int *类型的指针,保存的仍然是刚才的整形空间的地址,但是指向的内存已经被释放了,因此指针p无效,需要及时置为空指针:
p = NULL;
注意:使用new、delete创建动态数组和释放相关内存使用举例如下:
int *p=new int[]; //指针p所指向的数组未初始化
int *p=new int[m]; //指针p指向长度为m的数组,未初始化
int *p=new int[](); //指针p所指向的地址初始化为0
delete [] p; //回收p所指向的数组
四、new/delete与malloc/free的区别
1、属性
new、delete是C++中的操作符需要编译器支持,而malloc和free是标准库函数,需要加入头文件stdlib.h。
2、参数
malloc需要自行指定动态分配内存的大小,而new在指定指针类型之后可以自动分配内存,无需指定大小。
3、返回值类型
malloc返回的指针需要进行强制类型转换,new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,
4、分配失败
new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。
5、自定义类型(指针)
对于非内部数据对象(C++)来说,只使用malloc是无法完成动态对象要求的,一般在创建对象时需要调用构造函数,对象消亡时,自动的调用析构函数。而malloc free是库函数而不是运算符,不在编译器控制范围之内,不能够自动调用构造函数和析构函数。
而new在为对象申请分配内存空间时,可以自动调用构造函数,同时也可以完成对对象的初始化。同理,delete也可以自动调用析构函数。
而mallloc只是做一件事,只是为变量分配了内存,同理,free也只是释放变量的内存。