C语言中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.总结
到此这篇关于C语言中new与malloc的区别详解的文章就介绍到这了,更多相关C语言new与malloc的区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!