C++ 中 malloc/free与 new/delete区别
C++ 中 malloc/free 与 new/delete 的区别
1. 基本概念
malloc/free:C/C++ 标准库函数,用于动态内存的申请和释放。new/delete:C++ 运算符,用于动态内存的申请和释放,同时支持对象的构造和析构。
2. 功能差异
malloc/free:- 仅负责内存的分配和释放。
- 无法调用对象的构造函数和析构函数。
- 需要手动计算内存大小(字节数)。
new/delete:- 自动分配内存并调用构造函数。
- 自动释放内存并调用析构函数。
- 内置
sizeof、类型转换和类型安全检查。
3. 类型安全
malloc:非类型安全,返回 void*,需要手动类型转换。int* p = malloc(2 * sizeof(float)); // 编译时不报错new:类型安全,编译器会检查类型匹配。int* p = new float[2]; // 编译时报错
4. 返回值与错误处理
malloc:分配失败时返回空指针(NULL)。new:默认分配失败时抛出 std::bad_alloc 异常,但支持无抛出版本。
5. 使用场景
malloc/free:- 适用于 C 语言或与 C 代码交互。
- 仅用于内存管理,不涉及对象构造和析构。
new/delete:- 适用于 C++ 对象的内存管理。
- 支持构造和析构函数调用。
6. 使用方式
-
malloc/free:int* p = (int*)malloc(sizeof(int) * length); free(p); -
new/delete:int* p = new int[length]; delete[] p;
7. 其他区别
malloc/free:- 需要
头文件支持。 - 不支持重载。
- 需要
new/delete:- 是 C++ 关键字,无需头文件支持。
- 支持重载 operator new 和 operator delete。
8. 相同点
都可以用于动态内存的申请和释放。
总结
- new/delete 是 C++ 的运算符,支持对象的构造和析构,类型安全,使用更简单。
- malloc/free 是 C/C++ 的标准库函数,仅用于内存管理,不涉及对象构造和析构。
- 在 C++ 中,优先使用 new/delete,但在与 C 代码交互时,仍需使用 malloc/free。
| 特征 | new/delete | malloc/free |
|---|---|---|
| 分配内存的位置 | 自由存储区 | 堆 |
| 内存分配成功的返回值 | 完整类型指针 | void* |
| 内存分配失败的返回值 | 默认抛出异常 | 返回NULL |
| 分配内存的大小 | 由编译器根据类型计算得出 | 必须显式指定字节数 |
| 处理数组 | 有处理数组的new版本new[] | 需要用户计算数组的大小后进行内存分配 |
| 已分配内存的扩充 | 无法直观地处理 | 使用realloc简单完成 |
| 是否相互调用 | 可以,看具体的operator new/delete实现 | 不可调用new |
| 分配内存时内存不足 | 客户能够指定处理函数或重新制定分配器 | 无法通过用户代码进行处理 |
| 函数重载 | 允许 | 不允许 |
| 构造函数与析构函数调用 | 调用 | 不调用 |

浙公网安备 33010602011771号