new/delete和malloc/free之间的区别是什么?
new
delete
malloc
free
相关(重复?):在什么情况下我使用malloc vs new?
最相关的区别是new操作符分配内存,然后调用构造函数,而delete调用析构函数,然后释放内存。
new调用对象的ctor, delete调用对象的dtor。
malloc,free只是分配和释放原始内存。
在c++中,new/delete相应地调用构造函数/析构函数。
malloc/free只是从堆中分配内存。new/delete也分配内存。
new/delete是c++, malloc/free来自古老的C。
在c++中,new调用对象的构造函数,而delete调用析构函数。
malloc和free来自OO之前的黑暗时代,它们只分配和释放内存,而不执行对象的任何代码。
new和delete是c++的原语,它们声明一个类的新实例或删除它(从而为该实例调用类的析构函数)。
malloc和free是C 功能,它们分配和释放内存块(大小)。
两者都使用堆来进行分配。尽管如此,malloc和free是更“低级”的,因为它们只是保留了一块可能与指针相关的内存空间。在该内存周围不会创建任何结构(除非您将C数组视为结构)。
唯一的相似之处是malloc/new都返回一个指向堆上内存的指针,并且它们都保证一旦这样的内存块被返回,它就不会再次返回,除非你先释放/删除它。也就是说,它们都“分配”内存。
然而,new/delete通过构造函数、析构函数和运算符重载执行任意其他工作。malloc/free只分配和释放内存。
事实上,new是足够自定义的,它不一定从堆中返回内存,甚至根本不分配内存。但是默认的new可以。
NULL
std::set_new_handler
operator new
operator delete
void*
从技术上讲,由new分配的内存来自“Free Store”,而由malloc分配的内存来自“Heap”。这两个区域是否相同是一个实现细节,这是malloc和new不能混合的另一个原因。
同时,
全局的new和delete可以被覆盖,malloc/free不能。
此外,每个类型都可以重写new和delete。
有一些事情new做而malloc不做:
所以,如果你使用malloc,那么你需要显式地做上面的事情,这并不总是实际的。此外,new可以重载,但malloc不能重载。
总之,如果你使用c++,尽量使用new。
new和malloc之间的主要区别是new调用对象的构造函数,而对应的delete调用对象的析构函数。
还有其他不同之处:
new是类型安全的,malloc返回类型为void*的对象
new在错误时抛出异常,malloc返回NULL并设置errno
new是一个操作符,可以重载,malloc是一个函数,不能重载
分配数组的new[]比malloc更直观和类型安全
new[]
__abc0派生的分配可以通过realloc调整大小,__abc2派生的分配不能调整大小
realloc
malloc可以分配一个n字节的内存块,必须要求new分配一个数组,比如char类型
char
看区别,总结是malloc是C式的,new是c++式的。使用适合您代码库的版本。
虽然使用不同的内存分配算法实现new和malloc是合法的,但在大多数系统上,new是使用malloc在内部实现的,不会产生系统级的差异。
malloc()
<stdlib.h>
<alloc.h>
new和delete是c++中的操作符;也可以重载。 在c中,Malloc和free是函数
Malloc返回空PTR失败时,而新的抛出异常。
地址需要再次按类型强制转换,因为它返回(void*)malloc(size) 新返回类型化指针
1.New syntex比malloc()简单
3.New /delete执行速度比malloc()/free()快,因为编译器直接粘贴了新的程序集代码。
4.我们可以通过操作符重叠来改变程序中的new/delete含义。
#include<iostream> using namespace std; class ABC{ public: ABC(){ cout<<"Hello"<<endl; } void disp(){ cout<<"Hi\n"; } }; int main(){ ABC* b=(ABC*)malloc(sizeof(ABC)); int* q = new int[20]; ABC *a=new ABC(); b->disp(); cout<<b<<endl; free(b); delete b; //a=NULL; b->disp(); ABC(); cout<<b; return 0; }
输出: Hello Hi 0x2abfef37cc20
输出:
Hello Hi 0x2abfef37cc20