跳到主要内容

new和malloc的区别

new的定义

new是运算符,可以用于动态分配。如果空间分配失败,会返回空指针。使用new申请空间时,是从系统的“堆”(heap)中分配空间,申请所得的空间的位置时根据当时的内存的实际使用情况决定的。但是,在某些特殊情况下,可能需要在程序员指定的特定内存创建对象,这就是所谓的“定位放置new”(placement new)操作。例如:int *p = int(2)

malloc的定义

malloc的全称是memory allocation,也就是动态内存分配。该函数会申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址。

二者的区别

  1. new是关键字,需要编译器支持;malloc是库函数,需要头文件支持。
  2. new申请内存无需指定内存大小,编译器会根据类型信息自行计算。除此之外,new会调用构造函数。malloc必须由我们计算需要申请的字节数,需要显式指出所需内存的尺寸,并且返回后强行转换为实际类型的指针。而且malloc只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值是随机的。
  3. new有处理数组的new[],使用new[]分配的内存必须使用delete[]进行释放。malloc要想动态分配一个数组的内存,需要我们手动定义数组的大小。使用malloc分配内存必须使用free来释放内存。
  4. new分配成功返回的是对象类型指针,与对象严格匹配,无类型转换,所以new是符合类型安全性操作符;malloc返回值类型是void*,一般需要接强制类型转换成我们需要的类型。
  5. new内存分配失败的时候,抛出bad_ alloc异常 ;malloc分配内存失败时返回NULL。
  6. new会先调用operator new函数,申请足够的内存,然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存。 malloc是库函数,只能动态地申请和释放内存,无法强制要求其做自定义类型对象构造和析构函数。
  7. new可以重载,malloc不可以重载
  8. new的效率比malloc高。new属于关键字,malloc属于库函数。