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

时间:2008-10-27 15:05:30

标签: c++ memory-management

new / deletemalloc / free之间有什么区别?

相关(重复?):In what cases do I use malloc vs new?

14 个答案:

答案 0 :(得分:450)

新/删除

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

的malloc /免费

  • 分配/释放内存
    1. 从'堆'
    2. 分配的内存
    3. 返回void *
    4. 失败时返回NULL
    5. 必须以字节为单位指定所需的大小。
    6. 分配数组需要手动计算空间。
    7. 简单地重新分配大块内存(无需复制构造函数)
    8. 他们将致电新/删除
    9. 无法将用户代码拼接到分配序列中以帮助降低内存。
    10. malloc / free可以 NOT 合法覆盖

表格特征比较:

 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不能混合的另一个原因。

答案 1 :(得分:79)

最相关的区别是new运算符分配内存然后调用构造函数,delete调用析构函数然后释放内存。

答案 2 :(得分:29)

new调用对象的ctor,delete调用dtor。

malloc& free只需分配和释放原始内存。

答案 3 :(得分:13)

在C ++中new / delete相应地调用构造函数/析构函数。

malloc / free只是从堆中分配内存。 new / delete也会分配内存。

答案 4 :(得分:12)

new / delete是C ++,malloc / free来自优秀的旧C。

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

来自OO之前的黑暗时代的

mallocfree仅分配并释放内存,而不执行任何对象的代码。

答案 5 :(得分:10)

唯一的相似之处是malloc / new都返回一个指针,它指向堆上的某些内存,并且它们都保证一旦返回了这样的内存块,它就不会除非您先取消/删除它,否则请再次退回。也就是说,它们都“分配”内存。

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

实际上,new可以自定义,它不一定从堆返回内存,甚至根本不分配内存。但是默认new会这样做。

答案 6 :(得分:6)

new和malloc之间的主要区别是new调用对象的构造函数,相应的delete调用调用对象的析构函数。

还有其他不同之处:

  • new是类型安全的,malloc返回void*类型的对象

  • new在出错时抛出异常,malloc返回NULL并设置错误

  • new是一个操作符,可以重载,malloc是一个函数,无法重载

  • 分配数组的
  • new[]malloc

  • 更直观,更安全。
  • malloc - 派生的分配可以通过realloc调整大小,new - 派生的分配无法调整大小

  • malloc可以分配一个N字节的内存块,new必须要求分配一个数组,比如char类型

看看差异,总结是malloc是C-esque,new是C ++ - esque。使用适合您的代码库的那个。

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

答案 7 :(得分:5)

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

  1. new通过调用该对象的构造函数来构造对象
  2. malloc不需要对已分配的内存进行类型转换。
  3. 它不需要分配大量内存,而是需要一定数量的内存 要建造的物体。
  4. 所以,如果你使用new,那么你需要明确地做上面的事情,这并不总是实际的。此外,malloc可能会过载,但new不能重载。

    总之,如果您使用C ++,请尝试尽可能使用{{1}}。

答案 8 :(得分:4)

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

每种类型都可以覆盖更多新的和删除。

答案 9 :(得分:3)

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

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

两者都使用堆来进行分配。 mallocfree更加“低级别”,因为它们只保留了一块可能与指针相关联的内存空间。在该内存周围没有创建任何结构(除非您将C数组视为结构)。

答案 10 :(得分:2)

  • new是一个运算符,而malloc()是一个函数。
  • new返回确切的数据类型,而malloc()返回void *(void类型的指针)。
  • malloc(),内存未初始化,默认值为垃圾,而在新的情况下,内存使用默认值初始化,如使用'零(0)'如果是int。
  • delete和free()都可以用于' NULL'指针。

答案 11 :(得分:1)

  • 要使用malloc(),我们需要包含 <stdlib.h>或 程序中的<alloc.h> new
  • 不需要
  • newdelete可能会超载但malloc无法重载。
  • 使用展示位置new,我们可以传递我们想要的地址 分配内存,但在malloc
  • 的情况下,这是不可能的

答案 12 :(得分:0)

此代码用于删除关键字或自由功能。但是当创造一个 指针对象使用'malloc'或'new'并释放对象内存使用 甚至删除该对象指针也可以在类中调用函数。后 使用免费而不是删除然后它也可以在免费声明后使用, 但是当使用两者时,只有指针对象无法调用类中的函数。 代码如下:

#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

答案 13 :(得分:-3)

1.new syntex比malloc()

简单

2.new/delete是malloc()/ free()的运算符 是一个功能。

3.new/delete执行速度比malloc()/ free()快,因为编译器直接粘贴了新的汇编代码。

4.我们可以在运算符重叠的帮助下更改程序中的新/删除含义。