new / delete和malloc / free有什么区别?

new / deletemalloc / free什么区别?

相关(重复?): 在什么情况下,我使用malloc vs新?

新/删除

  • 分配/释放内存
    1. 从“Free Store”分配的内存
    2. 返回一个完全types的指针。
    3. 新(标准版)从不返回NULL(将失败)
    4. 用Type-ID调用(编译器计算大小)
    5. 有明确的版本来处理数组。
    6. 重新分配(以获得更多的空间)不直观地处理(由于复制构造函数)。
    7. 是否调用malloc / free是实现定义的。
    8. 可以添加一个新的内存分配器来处理内存不足(set_new_handler)
    9. 运算符new / delete可以合法地覆盖
    10. 用于初始化/销毁对象的构造函数/析构函数

的malloc /免费

  • 分配/释放内存
    1. 从“堆”分配的内存
    2. 返回一个void *
    3. 失败时返回NULL
    4. 必须以字节指定所需的大小。
    5. 分配数组需要手动计算空间。
    6. 重新分配更大的内存块简单(没有复制构造函数担心)
    7. 他们不会叫新/删除
    8. 无法将用户代码拼接到分配序列中以帮助减less内存。
    9. 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。

mallocfree只是分配和释放原始内存。

在C ++中, new / delete调用Constructor / Destructor。

malloc / free只需从堆中分配内存。 new / delete分配内存。

new / delete是C ++, malloc / free来自好老C.

在C ++中, new调用对象构造函数和delete调用析构函数。

mallocfree ,来自OO之前的黑暗时代,只分配和释放内存,而不执行对象的任何代码。

唯一的相似之处是malloc / new都返回一个指向堆中某个内存的指针,并且它们都保证一旦这样的内存块被返回,它将不会被再次返回,除非你先释放/删除它。 也就是说,他们都“分配”内存。

但是, new / delete另外通过构造函数,析构函数和运算符重载来执行任意其他的工作。 malloc / free只能分配和释放内存。

实际上, new有足够的可定制性,它不一定从堆中返回内存,甚至根本不分配内存。 然而,默认的new

有一些malloc没有做的new事情:

  1. new通过调用该对象的构造函数来构造该对象
  2. new不需要分配内存的types转换。
  3. 它不需要分配大量的内存,而是需要构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派生的分配可以通过reallocresize, new派生的分配不能resize

  • malloc可以分配一个N字节的内存块, new必须被要求分配一个chartypes的数组

看看这些差异,一个总结是malloc是C-esque,新是C ++ – esque。 使用那个感觉正确的代码库。

尽pipe使用不同的内存分配algorithm来实现new和malloc是合法的,但在大多数系统中,新内部使用malloc在内部实现,不产生系统级差异。

也,

全局的new和delete可以被覆盖,malloc / free不能。

更多的新和删除可以被覆盖每个types。

newdelete是C ++ 原语 ,它声明一个类的新实例或删除它(从而调用实例的类的析构函数)。

mallocfree是C 函数 ,它们分配和释放内存块(大小)。

两者都使用堆来进行分配。 mallocfree是更“低级”的,因为它们只保留了一块可能与指针相关的内存空间。 内存周围没有创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>
  • newdelete可以重载,但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.可以在操作员叠加的帮助下更改程序中新增/删除的含义。