C++ 面试题 目录

C++ 中 malloc/free 和 new/delete 的区别是什么?

推荐答案

在C++中,malloc/freenew/delete 都是用于动态内存管理的工具,但它们之间存在一些关键区别:

  1. 语言特性

    • malloc/free 是C语言中的函数,而 new/delete 是C++中的运算符。
  2. 内存分配与初始化

    • malloc 只分配内存,不调用构造函数。
    • new 不仅分配内存,还会调用对象的构造函数进行初始化。
  3. 内存释放与析构

    • free 只释放内存,不调用析构函数。
    • delete 不仅释放内存,还会调用对象的析构函数进行清理。
  4. 类型安全

    • malloc 返回 void*,需要显式类型转换。
    • new 返回具体类型的指针,不需要类型转换。
  5. 内存分配失败处理

    • malloc 在分配失败时返回 NULL
    • new 在分配失败时抛出 std::bad_alloc 异常。
  6. 重载

    • malloc/free 不能被重载。
    • new/delete 可以被重载。

本题详细解读

1. 语言特性

mallocfree 是C标准库中的函数,而 newdelete 是C++中的运算符。这意味着 newdelete 是C++语言的一部分,能够更好地与C++的面向对象特性集成。

2. 内存分配与初始化

malloc 仅仅分配一块指定大小的内存区域,并返回指向该内存的指针。它不会调用任何构造函数,因此适用于C语言中的基本数据类型或结构体。

new 不仅分配内存,还会调用对象的构造函数来初始化对象。这使得 new 更适合用于C++中的类对象。

3. 内存释放与析构

free 只释放内存,不会调用任何析构函数。因此,如果使用 malloc 分配的内存用于对象,手动释放时可能会导致资源泄漏。

delete 不仅释放内存,还会调用对象的析构函数来清理资源。这对于C++中的类对象非常重要,因为析构函数通常会释放对象持有的资源。

4. 类型安全

malloc 返回的是 void* 类型的指针,因此在使用时需要显式地进行类型转换。

new 返回的是具体类型的指针,不需要进行类型转换,因此更加类型安全。

5. 内存分配失败处理

malloc 在内存分配失败时返回 NULL,因此在使用 malloc 时需要检查返回值是否为 NULL

new 在内存分配失败时会抛出 std::bad_alloc 异常,因此可以使用异常处理机制来捕获和处理内存分配失败的情况。

6. 重载

mallocfree 是C标准库中的函数,不能被重载。而 newdelete 是C++中的运算符,可以被重载。这使得开发者可以自定义内存分配和释放的行为。

-- -------------------- ---- -------
----- -------- ---------- ----- -
    ----- - - -------------
    -- ---- ----- -----------------
    ------ --
-

---- -------- ------------ -- -------- -
    --------
-
纠错
反馈