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

相关推荐
冰红茶兑滴水6 分钟前
Linux 线程控制
linux·c++·算法
c语言鹌鹑蛋9 分钟前
C++进阶 --- 多继承中的虚表问题
开发语言·c++
MengYiKeNan1 小时前
C++二分函数lower_bound和upper_bound的用法
开发语言·c++·算法
小林熬夜学编程2 小时前
C++第五十一弹---IO流实战:高效文件读写与格式化输出
c语言·开发语言·c++·算法
月夕花晨3742 小时前
C++学习笔记(30)
c++·笔记·学习
蠢蠢的打码2 小时前
8584 循环队列的基本操作
数据结构·c++·算法·链表·图论
不是编程家2 小时前
C++ 第三讲:内存管理
java·开发语言·c++
jianglq2 小时前
C++高性能线性代数库Armadillo入门
c++·线性代数
Lenyiin4 小时前
《 C++ 修炼全景指南:十 》自平衡的艺术:深入了解 AVL 树的核心原理与实现
数据结构·c++·stl
程序猿练习生4 小时前
C++速通LeetCode中等第5题-无重复字符的最长字串
开发语言·c++·leetcode