「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」。
作用
在C++中,new/malloc可以用来在堆空间中申请空间,对应的delete/free可以用来释放在堆中的空间,new/delete和malloc/free只能配对使用。
在C语言中,没有new/delete运算符,需要使用malloc/free申请和释放空间。
区别
- 库文件支持
- malloc/free是C/C++的标准库函数,需要库文件
stdlib.h支持 - new/delete是C++的运算符,不需要库文件支持
- malloc/free是C/C++的标准库函数,需要库文件
- 构造与析构函数
- 当使用new创建对象的时候,在把空间申请好以后,还会调用类的构造函数,而使用delete释放对象所占空间的时候,会首先调用类的析构函数,然后释放对象所占的空间
- malloc/free则无法实现这个功能
- 计算分配空间
- new能够自动计算需要分配的内存空间。例如,
int *p2 = (int*)malloc(2 * sizeof(int)) - 而malloc需要手工计算字节数。例如,
int *p1 = new int[2]
- new能够自动计算需要分配的内存空间。例如,
- 类型安全
- new是类型安全的,例如
int *p=new float[2]编译时就会报错; - malloc不是类型安全的,例如
int *p = malloc(2 * sizeof(float)),编译时编译器就无法指出错误。
- new是类型安全的,例如
- 重载
- new一般由两步构成,分别是new操作和构造。new操作对应malloc,但new操作可以重载,可以自定义内存分配策略,不做内存分配,甚至分配到非内存设备上
- malloc不行
空间回收
delete和free被调用后,内存不会立即收回,指针也不会指向空。delete或free仅仅是告诉操作系统,这一块内存被释放了,可以用作其他用途。但是,由于没有重新对这块内存进行写操作,所以内存中的变量数值并没有发生变化,出现野指针的情况。因此,释放完内存后,应该将指针指向置位空。
为什么new/delete、malloc/free要同时存在
new/delete的功能完全覆盖了malloc/free,但是由于C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存,所以仍然保留了malloc/free。