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

new/deletemalloc/free有什么区别?

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

最佳答案

新建/删除

  • 分配/释放内存
    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/免费

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

特征表对比:

功能 新建/删除 malloc/免费
分配的内存 '免费商店' '堆'
返回 全类型指针 void*
失败时 抛出(从不返回 NULL) 返回 NULL
所需尺寸 编译器计算 必须以字节为单位指定
处理数组 有明确的版本 需要手动计算
重新分配 没有直观处理 简单(无复制构造函数)
反向调用 定义的实现 没有
内存不足的情况 可以添加新的内存分配器 用户代码未处理
可覆盖 是的 没有
构造函数/析构函数的使用 是的 没有

从技术上讲,new 分配的内存来自“Free Store”,而malloc 分配的内存来自“Heap”。这两个区域是否相同是一个实现细节,这也是 mallocnew 不能混用的另一个原因。

https://stackoverflow.com/questions/240212/

相关文章:

c++ - 如何迭代枚举?

c++ - #pragma once 是安全的包含守卫吗?

c++ - C++中的逻辑异或运算符?

c++ - 为什么人们说使用随机数生成器时存在模偏差?

c++ - 空终止字符串的基本原理是什么?

c++ - 为什么 f(i = -1, i = -1) 未定义行为?

c++ - 轻松测量耗时

c++ - 在 C/C++ 中检测多余的#include?

c++ - 如何将彩色文本输出到 Linux 终端?

c++ - 删除 NULL 指针是否安全?