malloc和free是C语言中,申请内存和释放内存的方式;而new和delete是C++语言中申请内存和释放内存的方式
1.相同点:
功能相同,都是申请和释放内存
2.不同点:
1)格式不同:
molloc申请空间:
类型 *指针变量名=(类型 *)malloc(申请内存的字节数),例如:
int *p1 = (int *)malloc(sizeof(int)); //申请一个存放int型数据的空间
char *p2 = (char *)malloc(sizeof(char)); //申请一个存放char型数据的空间
double *p3 = (double *)malloc(sizeof(double)); //申请一个存放double型数据的空间
int *p4 = (int *)malloc(sizeof(int) * 5); //申请一个存放int型数组空间,数组可以存放5个int元素
注意:之所以要在malloc前面加上一个指针类型的强转,是因为malloc返回的是一个void *空类型指针
free释放空间:
free(指针变量名)
free(p1); //释放指针p1指向的内存
free(p2); //释放指针p2指向的内存
free(p3); //释放指针p3指向的内存
free(p4); //释放指针p4指向的内存
new申请空间:
类型 *指针变量名= new 类型
int *p1 = new int; //申请一个存放int型数据的空间
char *p2 = new char; //申请一个存放char型数据的空间
double *p3 = new double; //申请一个存放double型数据的空间
int *p4 = new int[5]; //申请一个存放int型数组空间,数组可以存放5个int元素
new在申请空间的时候也可以对指向的对象进行初始化,例如:
int *p5 = new int(3);
对于数组,可以通过memset赋值:
memset(p4, 0, 5*sizeof(int));
delete释放空间:
delete 指针变量名,或者
delete[] 指针变量名 //释放数组如果不加上[],结果将是不确定的
delete p1; //释放指针p1指向的内存
delete p2; //释放指针p2指向的内存
delete p3; //释放指针p3指向的内存
delete[] p4; //释放指针p4指向的内存,[]表示释放一个数组空间
2)free(NULL)是安全的,但delete NULL是非法的,如果delete NULL,编译器会提示错误:
3)申请对象空间的时候,new和delete可以触发构造和析构,但malloc和free不行