小编典典

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

all

new/deletemalloc/和有什么不一样free


阅读 79

收藏
2022-04-25

共1个答案

小编典典

new/delete

  • 分配/释放内存
    1. 从“免费存储”分配的内存。
    2. 返回一个完全类型化的指针。
    3. new(标准版)从不返回 a 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不能 合法 地被覆盖。

功能表对比:

特征 `new`/`delete` `malloc`/`free`
分配的内存 '免费商店' '堆'
退货 全类型指针 `void*`
失败时 投掷(永不返回`NULL`) 退货`NULL`
所需尺寸 由编译器计算 必须以字节为单位指定
处理数组 有明确的版本 需要手动计算
重新分配 处理不直观 简单(无复制构造函数)
反转的呼唤 实现定义
内存不足的情况 可以添加新的内存分配器 不由用户代码处理
可覆盖 是的
构造函数/析构函数的使用 是的

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

2022-04-25