new
/delete
和malloc
/free
有什么区别?
最佳答案
新建
/删除
- 分配/释放内存
- 从“免费存储”分配的内存。
- 返回一个完全类型化的指针。
new
(标准版本)从不返回NULL
(将抛出失败)。- 使用 Type-ID 调用(编译器计算大小)。
- 有一个明确处理数组的版本。
- 重新分配(以获取更多空间)没有直观地处理(因为复制构造函数)。
- 他们是否调用
malloc
/free
是实现定义的。 - 可以添加一个新的内存分配器来处理低内存(
std::set_new_handler
)。 operator new
/operator delete
可以合法覆盖。- 用于初始化/销毁对象的构造函数/析构函数。
malloc
/免费
- 分配/释放内存
- 从“堆”分配的内存。
- 返回一个
void*
。 - 失败时返回
NULL
。 - 必须以字节为单位指定所需的大小。
- 分配数组需要手动计算空间。
- 重新分配更大的内存块很简单(无需担心复制构造函数)。
- 他们将不调用
new
/delete
。 - 无法将用户代码拼接到分配序列中以帮助解决内存不足问题。
malloc
/free
可以不合法地被覆盖。
特征表对比:
功能 | 新建 /删除 |
malloc /免费 |
---|---|---|
分配的内存 | '免费商店' | '堆' |
返回 | 全类型指针 | void* |
失败时 | 抛出(从不返回 NULL ) |
返回 NULL |
所需尺寸 | 编译器计算 | 必须以字节为单位指定 |
处理数组 | 有明确的版本 | 需要手动计算 |
重新分配 | 没有直观处理 | 简单(无复制构造函数) |
反向调用 | 定义的实现 | 没有 |
内存不足的情况 | 可以添加新的内存分配器 | 用户代码未处理 |
可覆盖 | 是的 | 没有 |
构造函数/析构函数的使用 | 是的 | 没有 |
从技术上讲,new
分配的内存来自“Free Store”,而malloc
分配的内存来自“Heap”。这两个区域是否相同是一个实现细节,这也是 malloc
和 new
不能混用的另一个原因。
关于c++ - new/delete 和 malloc/free 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/240212/