共同点:
- 都是从堆上申请空间,并且需要用户手动释放。
不同点:
- malloc和free是标准库函数,new和delete是操作运算符。
- malloc申请的空间不会初始化,new可以初始化。
- malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可。
- malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型。
- malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常(底层区别)。
- 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理(底层区别)。
区别:
1. 对象类型的自动识别:
在使用 new 操作符时,编译器会自动识别对象的类型,并根据其所需内存大小为其分配内存空间,并返回一个指向该对象的指针;而在使用 malloc 函数时,我们需要手动指定所需内存空间的大小,且 malloc 函数分配的内存空间都是 void 类型的指针,需要通过强制类型转换后才能使用。
2. 构造和析构函数的执行:
使用 new 操作符动态地分配一个对象的内存空间时,还会自动调用该对象的构造函数进行初始化操作,而 delete 操作符会自动调用对象的析构函数进行内存回收;而使用 malloc 分配内存空间时,我们需要手动调用对象的构造函数进行初始化以及手动调用析构函数进行内存释放。
3. 内存泄漏风险:
使用 malloc/free 命令进行动态内存分配时,有可能会忘记调用 free 函数进行内存释放,从而导致内存泄漏;而使用 new/delete 操作符时,我们只需要关注对象的创建和销毁,编译器将会自动处理内存的分配与释放。
4. 适用范围:
new/delete 操作符 mainly 用于 C++ 的类对象动态内存分配和销毁,而 malloc/free 函数则更具通用性,可以用于任何类型的动态内存分配。