现在的位置: 首页 > 算法 > 正文

New和malloc有什么区别

2020年01月13日 算法 ⁄ 共 956字 ⁄ 字号 评论关闭

  在了解new和malloc的区别之前,我们首先要知道new和malloc的基本用法,malloc/free是C/C++的标准库函数,函数原型如下,而new是C++的运算符。

  malloc函数原型void *malloc(size_t_size);

  void* free(void * ptr);

  动态开辟内存

  malloc: int *p =(int*)malloc(sizeof(int))

  free(p)

  new: int *p = new int;

  delete p;

  开辟数组

  malloc: int * cpp = (int *)malloc(sizeof(int)*10);

  free(p);

  new: int *cpp = new int[10];

  delete[]cpp;

  new和malloc的区别:

  最大的区别:new在申请空间的时候会调用构造函数,malloc不会调用

  申请失败返回:new在申请空间失败后返回的是错误码bad_alloc,malloc在申请空间失败后会返回NULL

  属性上:new/delete是C++关键字需要编译器支持,maollc是库函数,需要添加头文件

  参数:new在申请内存分配时不需要指定内存块大小,编译器会更具类型计算出大小,malloc需要显示的指定所需内存的大小

  成功返回类型:new操作符申请内存成功时,返回的是对象类型的指针,类型严格与对象匹配,无需进行类型转换,因此new是类型安全性操作符。malloc申请内存成功则返回void*,需要强制类型转换为我们所需的类型

  自定义类型:new会先调operator new函数,申请足够的内存(底层也是malloc实现),然后调用类的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数来释放内存(底层是通过free实现)。malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构函数

  重载:C++允许重载new/delete操作符,特别的,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回地址。malloc不允许重载。

抱歉!评论已关闭.