自学内容网 自学内容网

[C/C++]new/delete 和 malloc/free 的区别?

new/delete 和 malloc/free 都是C/C++中用于动态内存管理的机制

但它们之间存在一些关键区别:

1. 语法和使用方式

  • new/delete:

    • new 是一个运算符,用来分配内存并调用对象的构造函数。
    • delete 也是运算符,它会先调用对象的析构函数,然后释放内存。
    • 它们主要用于类的对象,也可以用于基本数据类型。
  • malloc/free:

    • malloc 是一个标准库函数,用来分配指定大小的内存块,返回指向该内存块的指针。
    • free 也是一个标准库函数,用来释放由 malloc(或 callocrealloc)分配的内存。
    • 它们不调用任何构造函数或析构函数,适用于非对象类型的内存分配,也可用于原始数据类型的数组。

2. 构造与析构

  • new/delete 自动处理对象的构造和析构。
  • malloc/free 不处理构造和析构,这意味着你需要手动初始化分配的内存,并且在释放之前没有自动清理操作。

3. 返回类型

  • new 返回的是所创建对象的类型的指针。
  • malloc 总是返回 void*,需要显式地转换为适当的指针类型。

4. 失败时的行为

  • new 在无法分配足够的内存时,默认情况下会抛出 std::bad_alloc 异常。
  • malloc 在失败时返回 NULL,不会抛出异常,需要手动排查空指针问题。

5. 内存对齐

  • new 保证按照对象的要求进行正确的内存对齐。
  • malloc 通常也会正确对齐内存,但这依赖于具体的实现。

6. 使用场景

  • new/delete 更适合于C++代码,因为它们更符合面向对象编程的原则。
  • malloc/free 来自C语言,虽然在C++中也可以使用,但在C++中通常推荐使用 new/delete

7. 数组分配

  • new 可以通过 new[] 分配数组,并通过 delete[] 释放数组。
  • malloc 分配的数组需要通过计算所需的总字节数来确定大小,而 free 不区分是否为数组。

        总的来说,在C++中,new/delete 提供了更加类型安全和面向对象的方式来管理内存,而 malloc/free 则提供了更底层的控制。在现代C++编程中,推荐使用 new/delete 或者更好的智能指针(如 std::unique_ptrstd::shared_ptr),以及容器(如 std::vector)来管理动态内存,以减少内存泄漏和其他潜在的问题。


原文地址:https://blog.csdn.net/restore_1/article/details/144777604

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!