在 C++ 中,new 表达式与 malloc 函数在内存分配上有哪些根本区别?对应的释放操作 delete 与 free 又有哪些不同?请结合底层机制说明。
考察说明
考查对 C++ 内存管理机制的理解,包括 new/delete 与 malloc/free 的差异。
回答思路
- 【回答框架 1】new 和 malloc 的核心区别在于:new 不仅分配内存,还会调用构造函数初始化对象,返回类型安全的对象指针;malloc 仅分配指定字节数的原始内存,不进行初始化,返回 void*,需要强制类型转换。
- 【回答框架 2】delete 和 free 的区别:delete 调用析构函数销毁对象并释放内存,free 仅释放内存;对于非 POD 类型,使用 free 释放 new 分配的内存或使用 delete 释放 malloc 分配的内存都是未定义行为。
- 【回答框架 3】实现层面,new 底层通常调用 operator new,其内部可能使用 malloc 分配内存,但 new 成功返回时无需检查返回值,失败会抛出 std::bad_alloc 异常;malloc 失败返回 NULL,需要手动检查。
- 【回答框架 4】数组分配方面,new[] 和 delete[] 需要配对使用,delete[] 会依次调用每个元素的析构函数;malloc/free 不涉及构造析构,因此不区分单个或数组。
- 【回答框架 5】在异常安全性上,new 分配内存失败时抛出异常,可能影响异常流;malloc 返回 NULL 更便于 C 风格错误处理。
- 【关键点 1】new 会调用构造函数并返回类型指针,malloc 仅分配原始内存。
- 【关键点 2】delete 会调用析构函数,free 不调用。
- 【关键点 3】new 失败抛异常,malloc 失败返回 NULL。
- 【关键点 4】new[] 必须配 delete[],malloc/free 不区分数组。
- 【关键点 5】混用 new 与 free 或 malloc 与 delete 是错误的。
- 【易错点 1】误认为 new 只是 malloc 的封装,忽略构造函数调用。
- 【易错点 2】将 new[] 与 delete 混用导致未定义行为。
- 【易错点 3】认为 malloc 也会初始化内存。