malloc和new的区别

new与malloc的区别


1.new的定义

new是运算符,可以用于动态分配。如果想要撤销内存使用delete。new运算符使用的一般格式为new类型,用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。一般来说,使用new申请空间时,是从系统的“堆”(heap)中分配空间,申请所得的空间的位置时根据当时的内存的实际使用情况决定的。但是,在某些特殊情况下,可能需要在程序员指定的特定内存创建对象,这就是所谓的“定位放置new”(placement new)操作。例如:

int *p=new int(6);

2.malloc的定义

malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,且分配的大小就是程序要求的大小。(来源百度百科)

void *malloc(int size);

3.new与malloc的区别

3.1属性方面

new是关键字,需要编译器支持;malloc是库函数,需要头文件支持。

3.2参数方面

new申请内存无需指定内存大小,编译器会根据类型信息自行计算。除此之外,new会调用构造函数。

int* p=new int;//分配大小为sizeof(int)的空间
int* p=new int(6);//分配大小为sizeof(int)的空间,并且初始化为6

malloc必须由我们计算需要申请的字节数,需要显式指出所需内存的尺寸,并且返回后强行转换为实际类型的指针。而且malloc只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值是随机的。

int* p=(int)malloc(sizeof(int)100);//分配可以放下100个int的内存空间

3.3处理数组方面

new有处理数组的new[],使用new[]分配的内存必须使用delete[]进行释放。

int* ptr=new int[100];//分配100个int的内存空间

malloc要想动态分配一个数组的内存,需要我们手动定义数组的大小。使用malloc分配内存必须使用free来释放内存。

int* p=(int)malloc(sizeof(int)100);//分配可以放下100个int的内存空间

3.4返回类型

new分配成功返回的是对象类型指针,与对象严格匹配,无类型转换,所以new是符合类型安全性操作符;malloc返回值类型是void*,一般需要接强制类型转换成我们需要的类型。

3.5分配失败方面

new内存分配失败的时候,抛出bad_ alloc异常 ;malloc分配内存失败时返回NULL。

3.6自定义类型方面

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

3.7重载方面

new可以重载,malloc不可以重载。
opeartor new /operator delete可以被重载。标准库是定义了operator new函数和operator delete函数的8个重载版本,如下图所示:

//这些版本可能抛出异常 
void * operator new(size_t); 
void * operator new[](size_t); 
void * operator delete (void * )noexcept; 
void * operator delete[](void *0)noexcept; 
//这些版本承诺不抛出异常 
void * operator new(size_t ,nothrow_t&) noexcept; 
void * operator new[](size_t, nothrow_t& ); 
void * operator delete (void *,nothrow_t& )noexcept; 
void * operator delete[](void *0,nothrow_t& )noexcept;

我们可以自定义上面函数版本中的任意一个,前提是自定义版本必须位于全局作用域或者类作用域中。

3.8内存区域方面

new在自由储存区分配内存,malloc在堆上分配内存。
自由存储区(free store)是C++中通过new和delete动态分配和释放对象的抽象概念,通过new来申请的内存区域可称为自由存储区,通过delete归还内存。特别的,new甚至可以不为对象分配内存,定位new的功能可以做到这一点:

new (place_address) type

堆(heap)C语言和操作系统的术语,堆是操作系统所维护的一块特殊内存,它提供了动态分配的功能,当运行程序调用malloc()时就会从中分配,调用free()归还内存。
一般情况下,所有的C++编译器默认使用堆来实现自由存储,运算符new和delete内部默认是使用malloc和free的方式来被实现。

3.9内存泄漏方面

内存泄漏对于new和malloc都能检测出来,new可以明确指出是哪个文件的哪一行,但是malloc不可以明确指出是哪个文件的哪一行。

3.10效率方面

new是关键字,malloc是库函数,new的效率高于malloc。
new和malloc都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。所以说new的效率高于malloc。

4.总结

malloc和new的区别_第1张图片

你可能感兴趣的:(算法,数据结构)