C++ 和 C 语言中new/delete与malloc/free的区别

new/delete 和 malloc/free 是 C++ 和 C 语言中用于动态内存分配的两组不同的函数,它们之间存在一些关键的区别:

  1. 语言层面:

    • malloc 和 free 是 C 语言标准库中的函数,也可以在 C++ 中使用。
    • new 和 delete 是 C++ 语言中引入的操作符,专门用于对象的内存分配和释放。
  2. 构造和析构:

    • malloc 只负责分配内存,不调用对象的构造函数。free 也只是释放内存,不调用析构函数。
    • new 在分配内存的同时会调用对象的构造函数,初始化对象。delete 在释放内存前会调用对象的析构函数,进行清理工作。
  3. 类型安全:

    • malloc 返回一个 void* 类型的指针,需要手动转换为正确的类型,这可能会导致类型安全问题。
    • new 直接返回正确类型的指针,提高了类型安全性。
  4. 错误处理:

    • malloc 在无法分配内存时返回 NULL。
    • new 在默认情况下会抛出一个 std::bad_alloc 异常,除非使用了 nothrow 版本,例如 new (nothrow) T。
  5. 内存对齐:

    • new 通常确保内存对齐满足对象类型的要求。
    • malloc 分配的内存对齐通常是较为基本的,可能需要手动处理对于复杂类型的对齐要求。
  6. 重载:

    • new 和 delete 可以被重载,允许自定义它们的行为。
    • malloc 和 free 不能被重载。

因此,在 C++ 中,推荐使用 new 和 delete 来分配和释放对象的内存,以利用它们提供的构造、析构和类型安全等特性。如果只是简单地分配一段内存而不涉及对象构造,malloc 和 free 仍然可以使用,但这种情况比较少见。

相关推荐
starzy19902 小时前
深入理解Scala隐式值:编译期自动装配
开发语言·后端·scala
布莱克6052 小时前
Swift 条件语句详解:从 if 到 switch 的完整指南
开发语言·ssh·swift·switch·条件语句·guard·if
汉克老师2 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
吴可可1232 小时前
ActiveX调用WScript.Shell原理揭秘
开发语言
晴天的雨.9924 小时前
【C++】继承篇
java·开发语言·c++
SomeOtherTime4 小时前
第 1 讲:内存布局与所有权解剖——栈帧、胖指针与“移动/拷贝”在汇编层面的真实面目
java·开发语言·汇编
青少儿编程课堂4 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven4 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_406981034 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
总要学点什么4 小时前
第106篇:三维特效-流动线效果——让一颗光点沿整条线一路滚到头
开发语言·javascript·ecmascript·gis·webgl·材质·cesium