new、delete和malloc、free的异同

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不行

猜你喜欢

转载自blog.csdn.net/qq_33757398/article/details/81318966