C++ 中 malloc/free与 new/delete区别

C++ 中 malloc/freenew/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
分配内存时内存不足 客户能够指定处理函数或重新制定分配器 无法通过用户代码进行处理
函数重载 允许 不允许
构造函数与析构函数调用 调用 不调用
posted @ 2025-03-05 18:54  michaelchengjl  阅读(99)  评论(0)    收藏  举报