提问者:小点点

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


新建/删除malloc/免费有什么区别?

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


共3个答案

匿名用户

  • 分配/释放内存
    1. 从“可用存储”分配的内存
    2. 返回完全类型的指针。
    3. 新建(标准版本)从不返回NULL(失败时将抛出)
    4. 使用Type-ID调用
    5. (编译器计算大小)
    6. 具有显式处理数组的版本。
    7. 重新分配(以获得更多空间)没有直观地处理(因为复制构造函数)。
    8. 它们是否调用malloc/free是实现定义的。
    9. 可以添加新的内存分配器来处理低内存(set_new_handler)
    10. 运算符new/delete可以合法覆盖
    11. 用于初始化/销毁对象的构造函数/析构函数
  • 分配/释放内存
    1. 从“堆”分配的内存
    2. 返回空*
    3. 失败时返回NULL
    4. 必须指定所需的大小(以字节为单位)。
    5. 分配数组需要手动计算空间。
    6. 重新分配较大内存块很简单(无需担心复制构造函数)
    7. 它们将调用新建/删除
    8. 无法将用户代码拼接到分配序列中以帮助解决内存不足的问题。
    9. malloc/free不能合法覆盖

特性对比表:

 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分配的内存来自“空闲存储”,而malloc分配的内存来自“堆”。 这两个区域是否相同是一个实现细节,这也是malloc和new不能混合的另一个原因。

匿名用户

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

匿名用户

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

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