new是运算符,可以用于动态分配。如果想要撤销内存使用delete。new运算符使用的一般格式为new类型,用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。一般来说,使用new申请空间时,是从系统的“堆”(heap)中分配空间,申请所得的空间的位置时根据当时的内存的实际使用情况决定的。但是,在某些特殊情况下,可能需要在程序员指定的特定内存创建对象,这就是所谓的“定位放置new”(placement new)操作。例如:
int *p=new int(6);
malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,且分配的大小就是程序要求的大小。(来源百度百科)
void *malloc(int size);
new是关键字,需要编译器支持;malloc是库函数,需要头文件支持。
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的内存空间
new有处理数组的new[],使用new[]分配的内存必须使用delete[]进行释放。
int* ptr=new int[100];//分配100个int的内存空间
malloc要想动态分配一个数组的内存,需要我们手动定义数组的大小。使用malloc分配内存必须使用free来释放内存。
int* p=(int)malloc(sizeof(int)100);//分配可以放下100个int的内存空间
new分配成功返回的是对象类型指针,与对象严格匹配,无类型转换,所以new是符合类型安全性操作符;malloc返回值类型是void*,一般需要接强制类型转换成我们需要的类型。
new内存分配失败的时候,抛出bad_ alloc异常 ;malloc分配内存失败时返回NULL。
new会先调用operator new函数,申请足够的内存,然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存。
malloc是库函数,只能动态地申请和释放内存,无法强制要求其做自定义类型对象构造和析构函数。
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;
我们可以自定义上面函数版本中的任意一个,前提是自定义版本必须位于全局作用域或者类作用域中。
new在自由储存区分配内存,malloc在堆上分配内存。
自由存储区(free store)是C++中通过new和delete动态分配和释放对象的抽象概念,通过new来申请的内存区域可称为自由存储区,通过delete归还内存。特别的,new甚至可以不为对象分配内存,定位new的功能可以做到这一点:
new (place_address) type
堆(heap)C语言和操作系统的术语,堆是操作系统所维护的一块特殊内存,它提供了动态分配的功能,当运行程序调用malloc()时就会从中分配,调用free()归还内存。
一般情况下,所有的C++编译器默认使用堆来实现自由存储,运算符new和delete内部默认是使用malloc和free的方式来被实现。
内存泄漏对于new和malloc都能检测出来,new可以明确指出是哪个文件的哪一行,但是malloc不可以明确指出是哪个文件的哪一行。
new是关键字,malloc是库函数,new的效率高于malloc。
new和malloc都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。所以说new的效率高于malloc。