malloc/free 和 new/delete的区别

malloc/freenew/delete 是 C++ 中两种不同的动态内存管理方法,它们有一些关键的区别:

1. 内存分配和释放机制

  • mallocfree:

    • 函数 : malloc 是一个 C 标准库函数,用于从堆中分配指定大小的原始内存块。它返回一个 void* 指针,指向分配的内存块的起始位置。free 用于释放由 malloc 分配的内存,防止内存泄漏。
    • 初始化 : malloc 仅分配内存,但不调用构造函数,因此分配的内存内容是未初始化的。
    • 类型转换 : 因为 malloc 返回的是 void*,在 C++ 中需要进行显式类型转换。
    cpp 复制代码
    int *arr = (int*)malloc(10 * sizeof(int));  // 分配10个int的内存空间
    free(arr);  // 释放内存
  • newdelete:

    • 运算符 : new 是一个运算符,用于分配内存,并且调用对象的构造函数来初始化分配的内存。delete 是相应的运算符,用于释放由 new 分配的内存,并调用对象的析构函数。
    • 初始化 : new 分配内存并同时调用构造函数,因此分配的内存是已初始化的。
    • 类型安全 : new 不需要显式的类型转换,直接返回指向指定类型的指针。
    cpp 复制代码
    int *arr = new int[10];  // 分配10个int的内存空间并初始化
    delete[] arr;  // 释放内存并调用析构函数

2. 类型安全

  • malloc/free : 因为 malloc 返回 void*,它与特定类型无关,需要显式地进行类型转换。因此,类型检查完全依赖于程序员的注意。
  • new/delete : new 是类型安全的,因为它直接返回指向特定类型的指针,不需要进行显式的类型转换,编译器可以进行类型检查。

3. 调用构造函数和析构函数

  • malloc/free:

    • malloc 只分配内存,不调用对象的构造函数。
    • free 只释放内存,不调用对象的析构函数。这在处理复杂对象时可能导致资源泄漏。
  • new/delete:

    • new 分配内存并调用构造函数。
    • delete 释放内存并调用析构函数。这使得 new/delete 更适合管理包含资源的复杂对象,如文件句柄、网络连接等。

4. 内存分配失败的处理

  • malloc/free:

    • malloc 分配失败时返回 NULL,程序员需要手动检查返回值并处理错误。
    cpp 复制代码
    int *arr = (int*)malloc(10 * sizeof(int));
    if (arr == NULL) {
        // 处理分配失败
    }
  • new/delete:

    • new 分配失败时会抛出 std::bad_alloc 异常(除非使用 nothrow 版本的 new),这允许使用 C++ 的异常处理机制。
    cpp 复制代码
    try {
        int *arr = new int[10];
    } catch (std::bad_alloc &e) {
        // 处理分配失败
    }

5. 用途

  • malloc/free:

    • malloc/free 更适合 C 语言或在 C++ 中需要兼容 C 代码的场景,主要用于分配原始内存块。
    • 不适用于需要对象构造和析构的场景。
  • new/delete:

    • new/delete 是 C++ 提供的内存管理机制,更适合 C++ 对象的内存分配和管理。
    • 支持对象的构造和析构,适用于动态创建复杂对象。

总结

  • malloc/free 是 C 语言的内存管理函数,分配和释放原始内存块,不涉及对象的构造和析构,适合需要分配未初始化内存的场景。
  • new/delete 是 C++ 运算符,分配和释放内存时会调用构造函数和析构函数,适合在 C++ 中动态管理对象。new 提供了类型安全,并在内存分配失败时抛出异常。

推荐学习 https://xxetb.xetslk.com/s/p5Ibb

相关推荐
blasit1 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
肆忆_2 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星2 天前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛4 天前
delete又未完全delete
c++
端平入洛5 天前
auto有时不auto
c++
哇哈哈20216 天前
信号量和信号
linux·c++
多恩Stone6 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
蜡笔小马6 天前
21.Boost.Geometry disjoint、distance、envelope、equals、expand和for_each算法接口详解
c++·算法·boost
超级大福宝6 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode
weiabc6 天前
printf(“%lf“, ys) 和 cout << ys 输出的浮点数格式存在细微差异
数据结构·c++·算法