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

相关推荐
Ajiang282473530433 分钟前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
‘’林花谢了春红‘’5 小时前
C++ list (链表)容器
c++·链表·list
机器视觉知识推荐、就业指导7 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
Yang.999 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
熬夜学编程的小王9 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
zz40_9 小时前
C++自己写类 和 运算符重载函数
c++
六月的翅膀9 小时前
C++:实例访问静态成员函数和类访问静态成员函数有什么区别
开发语言·c++
liujjjiyun10 小时前
小R的随机播放顺序
数据结构·c++·算法
¥ 多多¥10 小时前
c++中mystring运算符重载
开发语言·c++·算法