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

标签 c++ memory-management

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

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

相关文章:

c++ - 通过一次调用 new 运算符来批量分配对象?

c++ - XML 数据绑定(bind)和 C++ 代码生成器

c++ - 已签名基础类型枚举的位域溢出

c++ - 这种错误检查方法在性能上会不会太昂贵了?

C++ : pointers change?

javascript - JavaScript 对象的终结器

c++ - 函数内的字符串文字 : automatic variables or allocated in heap?

c++ - delete[] 是否在调用析构函数后一次性释放内存?

c++ - 如何优化字符串复制(内存分配)?

c++ - 如果指针是一个函数 arguemente 并且正在通过引用传递值,我应该删除它吗?