new / delete和malloc / free有什么区别?
new
/ delete
和malloc
/ free
什么区别?
相关(重复?): 在什么情况下,我使用malloc vs新?
新/删除
- 分配/释放内存
- 从“Free Store”分配的内存
- 返回一个完全types的指针。
- 新(标准版)从不返回NULL(将失败)
- 用Type-ID调用(编译器计算大小)
- 有明确的版本来处理数组。
- 重新分配(以获得更多的空间)不直观地处理(由于复制构造函数)。
- 是否调用malloc / free是实现定义的。
- 可以添加一个新的内存分配器来处理内存不足(set_new_handler)
- 运算符new / delete可以合法地覆盖
- 用于初始化/销毁对象的构造函数/析构函数
的malloc /免费
- 分配/释放内存
- 从“堆”分配的内存
- 返回一个void *
- 失败时返回NULL
- 必须以字节指定所需的大小。
- 分配数组需要手动计算空间。
- 重新分配更大的内存块简单(没有复制构造函数担心)
- 他们不会叫新/删除
- 无法将用户代码拼接到分配序列中以帮助减less内存。
- malloc / free 不能被合法覆盖
表格比较的function:
Feature | new/delete | malloc/free --------------------------+--------------------------------+------------------------------- Memory allocated from | 'Free Store' | 'Heap' Returns | Fully typed pointer | void* On failure | Throws (never returns NULL) | Returns NULL Required size | Calculated by compiler | Must be specified in bytes Handling arrays | Has an explicit version | Requires manual calculations Reallocating | Not handled intuitively | Simple (no copy constructor) Call of reverse | Implementation defined | No Low memory cases | Can add a new memory allocator | Not handled by user code Overridable | Yes | No Use of (con-)/destructor | Yes | No
技术上来说,由new分配的内存来自“Free Store”,而由malloc分配的内存来自“Heap”。 这两个领域是否相同是一个实现细节,这是malloc和new不能混合的另一个原因。
最相关的区别是new
运算符分配内存,然后调用构造函数,并delete
调用析构函数,然后释放内存。
new
调用对象的ctor, delete
调用dtor。
malloc
& free
只是分配和释放原始内存。
在C ++中, new
/ delete
调用Constructor / Destructor。
malloc
/ free
只需从堆中分配内存。 new
/ delete
分配内存。
new
/ delete
是C ++, malloc
/ free
来自好老C.
在C ++中, new
调用对象构造函数和delete
调用析构函数。
malloc
和free
,来自OO之前的黑暗时代,只分配和释放内存,而不执行对象的任何代码。
唯一的相似之处是malloc
/ new
都返回一个指向堆中某个内存的指针,并且它们都保证一旦这样的内存块被返回,它将不会被再次返回,除非你先释放/删除它。 也就是说,他们都“分配”内存。
但是, new
/ delete
另外通过构造函数,析构函数和运算符重载来执行任意其他的工作。 malloc
/ free
只能分配和释放内存。
实际上, new
有足够的可定制性,它不一定从堆中返回内存,甚至根本不分配内存。 然而,默认的new
。
有一些malloc
没有做的new
事情:
-
new
通过调用该对象的构造函数来构造该对象 -
new
不需要分配内存的types转换。 - 它不需要分配大量的内存,而是需要构build大量的对象。
所以,如果你使用malloc
,那么你需要明确地做以上的事情,这并不总是实际的。 另外, new
可以被重载,但是malloc
不可以。
总之,如果你使用C ++,尽可能地使用new
。
new和malloc之间的主要区别在于new调用对象的构造函数,相应的delete调用调用对象的析构函数。
还有其他的区别:
-
new
是types安全的,malloc
返回void*
types的对象 -
new
错误发生exception,malloc
返回NULL
并设置errno -
new
是一个运算符,可以被重载,malloc
是一个函数,不能被重载 -
new[]
分配数组,比malloc
更直观,更安全 -
malloc
派生的分配可以通过realloc
resize,new
派生的分配不能resize -
malloc
可以分配一个N字节的内存块,new
必须被要求分配一个char
types的数组
看看这些差异,一个总结是malloc是C-esque,新是C ++ – esque。 使用那个感觉正确的代码库。
尽pipe使用不同的内存分配algorithm来实现new和malloc是合法的,但在大多数系统中,新内部使用malloc在内部实现,不产生系统级差异。
也,
全局的new和delete可以被覆盖,malloc / free不能。
更多的新和删除可以被覆盖每个types。
new
和delete
是C ++ 原语 ,它声明一个类的新实例或删除它(从而调用实例的类的析构函数)。
malloc
和free
是C 函数 ,它们分配和释放内存块(大小)。
两者都使用堆来进行分配。 malloc
和free
是更“低级”的,因为它们只保留了一块可能与指针相关的内存空间。 内存周围没有创build结构(除非你认为C数组是一个结构)。
new和delete是c ++中的运算符; 这也可以超载。 malloc和free是c中的函数;
malloc在失败时返回空ptr,而新抛出exception。
malloc返回的地址需要通过types转换,因为它返回(void *)malloc(size)New返回types指针。
- new是一个运算符,而malloc()是一个函数。
- new返回确切的数据types,而malloc()返回void *(voidtypes的指针)。
- malloc(),内存没有初始化,默认值是垃圾,而在新的情况下,内存初始化为默认值,就像int中的“零(0)”。
- delete和free()都可以用于'NULL'指针。
- 要使用
malloc()
,我们需要在程序中包含<stdlib.h>
或<alloc.h>
。 -
new
和delete
可以重载,但malloc
不能。 - 使用
new
的位置,我们可以传递我们想要分配内存的地址,但是在malloc
情况下这是不可能的。
此代码使用删除关键字或免费function。 但是,当使用'malloc'或'new'创build一个指针对象并使用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
1.新syntex比malloc()简单
2.new/delete是一个运算符,malloc()/ free()是一个函数。
3.新/删除执行比malloc()/ free()更快,因为编译器直接粘贴新的汇编代码。
4.可以在操作员叠加的帮助下更改程序中新增/删除的含义。