malloc、free和new、delete的区别

基本概念

malloc、free

malloc、free是c语言中的库函数

void* malloc(long num_bytes);
void free(void *first_byte);

内存操作

malloc函数接收需要分配的内存字节数,如果内存足够,可以成功分配,会返回指向内存块起始位置的指针

free函数释放指针指向的内存,接收的参数是需要释放的内存的首地址

用法

malloc:

  1. malloc返回的是void*类型的指针,需要手动转换成指定类型的指针;
  2. malloc本身并不是别要申请的内存是什么类型,他只关心申请的内存的字节数
Type *ptr = (Type *)malloc(sizeof(Type) * length);

free:

free(ptr);

实际上,在调用malloc之后,返回给用户的指针指向的地址的前面还有一段元数据,这部分元数据记录了内存块的大小等数据

内存布局大概是这样的:

| 元数据(记录大小等信息) | 用户数据区(malloc返回的指针) |
^                           ^
|                           |
系统知道的块起始地址        malloc返回的p

元数据的大小是固定的,所以在调用free函数的时候会先找到这部分元数据,获得内存块大小之后再执行释放内存

new、delete

new和delete是c++中的操作符

new在被调用的时候首先会申请内存,然后执行构造函数构造对象

delete在被调用的时候首先执行析构函数析构对象,然后才是释放内存

用法

  1. new可以自动计算要分配的内存大小,只需要传给new对象类型和数量,因为new内置了sizeof、类型转换和类型安全检查等功能;
  2. 要构造一个对象就new Type,构造多个就new Type[num]
  3. delete释放一个对象就delete obj,delete释放一个数组就delete []array

区别

  1. malloc、free是c语言的库函数,而new、delete是c++的操作符(操作符可以重载)
  2. new自动计算所需分配内存,malloc需要手动计算
  3. new返回的是对象类型的指针,malloc返回void*,需要类型转换成对象类型
  4. delete释放内存时需要对象类型的指针,free是void*类型的指针
  5. new分配失败会抛出异常,malloc分配失败返回NULL空指针;这是基于c和c++语言的区别
  6. new在free store上分配内存,malloc在堆上分配
    这里free store指的是,new是c++的运算符,运算符可以重载,所以对于new的实现,可以是调用malloc在堆上申请内存,也可能是定向到一块已经申请好的静态全局内存上
  7. new先调用operator new进行内存申请,然后调用构造函数初始化成员变量,最后返回指针
    delete先调用析构函数,在调用operator delete释放内存
    c++的类对象,既需要申请内存,还需要初始化操作,释放时也需要析构和释放内存两步,所以才有了new和delete
  8. new是类型安全的,而malloc不是
    int *p = new float[5];编译时会报错
    int *p = malloc(5 * sizeof(float));编译时不报错
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐