两者都用于初始化分配内存。
malloc:
引入头文件 stdlib.h
内存大小:malloc通过计算得到一块新内存。
内存分配过程:使用malloc,向操作系统申请内存,操作系统会遍历空间内存节点,将第一个大于申请空间的内存分配给程序,然后将空闲链表节点删除。
成功分配:返回值为指向被分配内存的指针。
失败分配:返回NULL。
返回类型:void* 可通过强制转换为其他任意类型。
释放:free,使用free前需要确认指针非空。
new:
C++中的运算符。
new无需指定分配内存大小,会自动按照类型分配内存,并且会执行构造操作。
使用delete时注意将指针置为0,否则会形成悬垂指针。
所以可以认为 new = malloc + 构造。new更高级一些。
释放:delete 或 delete []
delete可以delete空指针。
为什么有了malloc还要有new?
因为主要是c语言中使用,malloc只能为基础数据类型分配内存,对于非内部数据类型动态对象而言,不能完成对象的初始化和构造,而new可以在编译器的控制权限内完成对象的初始化和销毁任务。
为什么有了new还要有malloc?
历史遗留问题,内部数据类型没有构造和析构的过程,所以malloc和new对它们是等价的。
然后C++程序经常调用C函数,C程序只能用malloc管理动态内存。
区别主要有以下几点:
1、属性
new是C++中的关键字,编译器支持的。
malloc是库函数,需要头文件支持的。引入头文件 stdlib.h
2、参数
malloc需要指定分配的内存大小。
new会自动根据类型分配对应的内存大小。
3、返回类型
new返回类型是与申请类型指针符合的,是类型安全的操作符。
malloc返回的都是void*,需要做一次强制转换。
4、分配失败。
new分配失败会抛异常。
malloc分配失败直接返回NULL。
5、自定义类型
new会先调用new函数,申请足够内存(底层通常还是使用malloc),然后调用类型的构造函数初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用free实现。
6、内存区域
new申请的内存在自由存储区。
malloc申请的内存在堆上。
自由存储区与堆得区别:堆是物理概念,自由存储区是逻辑概念。