【C/C++】new/delete、malloc/free的作用与区别

683 阅读2分钟

「这是我参与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++的运算符,不需要库文件支持
  • 构造与析构函数
    • 当使用new创建对象的时候,在把空间申请好以后,还会调用类的构造函数,而使用delete释放对象所占空间的时候,会首先调用类的析构函数,然后释放对象所占的空间
    • malloc/free则无法实现这个功能
  • 计算分配空间
    • new能够自动计算需要分配的内存空间。例如,int *p2 = (int*)malloc(2 * sizeof(int))
    • 而malloc需要手工计算字节数。例如,int *p1 = new int[2]
  • 类型安全
    • new是类型安全的,例如 int *p=new float[2]编译时就会报错;
    • malloc不是类型安全的,例如 int *p = malloc(2 * sizeof(float)),编译时编译器就无法指出错误。
  • 重载
    • 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。