new和malloc都是常用的申请动态内存方式,他们有以下区别:
1、malloc/free是C语言的标准库函数,new/delete是c++的运算符;
2、new/delete比malloc/free更智能,在申请和释放内存时会自动调用对象的构造函数和析构函数(其底层仍靠malloc/free来实现),malloc则只管分配内存并不对所得的内存初始化;
3、返回类型不同,new返回的是指定类型的指针,且自动计算所需内存的大小,malloc返回的是void*型,需要手动进行数据类型转换,且内存大小需要手动计算;
如:
int*pint_n=newint[10];//返回类型为int*型,申请内存大小为sizeof(int)*10;
int*pint_m=(int*)malloc(10*sizeof(int));//返回的是void*型,需手动强转为int*型
4、如果申请内存失败,表现形式不同,malloc申请内存失败后返回空指针NULL,new申请失败则抛出异常,直接比较指针是否为空是没有意义的,需要用try、catch的方式捕获异常;
如:
5、处理数组的方式不一样,C++提供了new[],delete[],可以通过构造函数和析构函数来逐个处理数组元素,malloc和free则不区分数组还是普通对象,更为佛系。
注意
执行delete删除指针执向的内存后,p变成了不确定指针(悬垂指针),这很容易导致程序运行错误,需要手动指定其值为NULL;
不管使用new还是malloc申请的动态内存,千万不要忘记最后使用对应的delete或free手动释放内存,要不然很容易造成内存溢出,造成不必要的严重后果。