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

标签 c++ memory-management

new/deletemalloc/free有什么区别?

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

最佳答案

new/delete

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

malloc/free

  • 分配/释放内存
    1. 从“堆”分配的内存。
    2. 返回 void* .
    3. 返回 NULL失败时。
    4. 必须以字节为单位指定所需的大小。
    5. 分配数组需要手动计算空间。
    6. 重新分配更大的内存块很简单(无需担心复制构造函数)。
    7. 他们不会调用new/delete .
    8. 无法将用户代码拼接到分配序列中以帮助解决低内存问题。
    9. malloc/free不能被合法覆盖。

功能表比较:

<表类="s-表"> <头> 特征 new/delete malloc/free <正文> 内存分配自 '免费商店' '堆' 返回 全类型指针 void* 失败时 抛出(从不返回 NULL ) 返回 NULL 要求大小 由编译器计算 必须以字节为单位指定 处理数组 有明确的版本 需要人工计算 重新分配 没有直观地处理 简单(无拷贝构造函数) 反向调用 实现定义 没有 低内存情况 可以添加一个新的内存分配器 不被用户代码处理 可覆盖 是 没有 构造函数/析构函数的使用 是 没有

从技术上讲,内存由 new 分配来自“免费商店”,而内存由 malloc 分配来自“堆”。这两个区域是否相同是一个实现细节,这是malloc的另一个原因。和 new不能混用。

关于c++ - new/delete 和 malloc/free 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7495168/

相关文章:

unix - vm.max_map_count和mmapfs

c++ - 删除顺序、NULL 指针或内存泄漏

java - OpenHFT/Chronicle-Values 中的 @Array(length= ?) 注解如何使用

c - C中的堆栈分配

c++ - 带字符间距的字符串

c++ - 二维 vector 大小的 Visual Studio 2015 断点条件

c++ - if 条件下的 IFDEF

c++ - ChangeDisplaySettingsEx() 总是返回 DISP_CHANGE_BADPARAM

c++ - 上交所加成产生垃圾

c++ - 使用 unique_ptr 和继承时双重释放或损坏