C++ 中 malloc() 和 new 的区别

2025年5月30日 | 阅读 7 分钟

在 C++ 中,malloc() 函数和 new 操作符主要用于动态分配内存。尽管两者都用于相同的目的,但在多种情况下它们是不同的。malloc() 和 new 的主要区别在于 new 是一个作为构造函数使用的操作符。另一方面,malloc() 函数是一个预定义的标准库函数,包含在 stdlib 头文件中。

在本文中,我们将讨论 C++ 中 malloc() 和 new 的区别。在讨论它们之间的区别之前,我们必须了解 C++ 中的 malloc() 和 new。

什么是 malloc()?

在 C++ 中,malloc() 是一个主要用于在运行时分配内存的函数。它返回一个 void 指针,这意味着它可以赋给任何指针类型。这个 void 指针可以进一步进行类型转换,以获得指向指定类型内存的指针。

语法

它具有以下语法:

在这个语法中,

  • type:表示需要分配内存的变量的数据类型。
  • variable_name:定义指向内存的变量名称。
  • (type*):用于类型转换,以便我们可以获得指向指定类型内存的指针。
  • sizeof():malloc() 函数中使用 sizeof() 操作符来获取分配所需的内存大小。

注意:malloc() 函数返回 void 指针,因此需要进行类型转换才能将不同类型赋给指针。malloc() 函数需要 sizeof() 操作符,因为 malloc() 函数返回原始内存,所以 sizeof() 操作符会告诉 malloc() 函数需要分配多少内存。

C++ Malloc 示例

让我们用一个例子来说明 C++ 中的 malloc() 函数。

示例

编译并运行

输出

Enter the count of numbers : 4
Enter a number : 5
Enter a number : 6
Enter a number : 7
Enter a number : 8
Entered elements are : 5
6
7
8

说明

在这个例子中,我们演示了使用 malloc() 进行动态内存分配。首先,它要求我们输入元素的数量,然后为这么多整数分配内存。之后,我们使用指针算术输入存储在动态分配数组中的值。

什么是 new?

在 C++ 中,new 操作符是一个内存分配操作符,主要用于在运行时分配内存。new 操作符初始化的内存分配在堆(heap)上。它返回内存的起始地址,该地址被赋给变量。在 C++ 中,new 操作符的功能与 C 语言中的 malloc() 函数类似。C++ 也兼容 malloc() 函数,但 new 操作符因其优势而更常被使用。

语法

它具有以下语法:

在这个语法中,

  • type:表示 new 操作符为之分配内存的变量的数据类型。
  • new:是用于分配内存的操作符。
  • variable:是指向内存的变量名称。
  • parameter_list:是初始化变量的值列表。

new 操作符不使用 sizeof() 操作符来分配内存。它也不使用 resize,因为 new 操作符会为对象分配足够的内存。它是一个构造函数,在声明时调用构造函数来初始化对象。

C++ New 操作符示例

让我们通过一个示例来说明 C++ 中的 new 操作符。

示例

编译并运行

输出

Enter the number : 
18
Entered number is 18

说明

在这个例子中,我们演示了用于动态分配单个整数内存的 new 操作符。首先,程序要求用户输入一个数字,该数字存储在 ptr 指向的内存位置。之后,打印输入的值。

malloc() 和 new 操作符的主要区别

malloc() 和 new 操作符之间的几个主要区别如下:

  • new 操作符构造一个对象,即它调用构造函数来初始化对象,而 malloc() 函数不调用构造函数。new 操作符调用构造函数,delete 操作符调用析构函数来销毁对象。
  • new 是一个操作符,而 malloc() 是 stdlib 头文件中的一个预定义函数。
  • new 操作符可以重载,而 malloc() 函数不能重载。
  • 如果堆中没有足够的内存,new 操作符将抛出异常,而 malloc() 函数返回 NULL 指针。
  • 在 new 操作符中,我们需要指定要分配的对象数量。另一方面,在 malloc() 函数中,我们需要指定要分配的字节数。
  • 对于 new 操作符,我们必须使用 delete 操作符来释放内存。但对于 malloc() 函数,我们必须使用 free() 函数来释放内存。
  • 使用 new 操作符分配内存后,就不能调整其大小。另一方面,使用 malloc() 函数分配的内存可以使用 realloc() 函数重新分配。
  • new 的执行时间比 malloc() 函数短,因为 new 是一个构造函数,而 malloc 是一个函数。
  • new 操作符不返回单独的指针变量;它返回新创建对象的地址。另一方面,malloc() 函数返回 void 指针,该指针可以进一步转换为指定类型。

malloc() 和 new 操作符的区别(表格形式)

C++ 中 malloc() 和 new 操作符之间有几个区别。以下是一些表格形式的主要区别。

特点malloc()new
类型它是 C 语言的库函数。它是一个操作符。
构造函数此函数不调用任何构造函数。此函数调用构造函数。
重载它不能被重载。它可以被重载。
初始化malloc() 中不能进行内存初始化。它可以在分配内存时初始化对象。
返回值它返回 void*(指针)。它返回数据类型。
失败当 malloc() 函数失败时,它返回 NULL 值。当 new 操作符失败时,它会抛出异常。
执行它需要更多时间来执行应用程序。它减少了应用程序的执行时间。
重新分配可以使用 realloc 方法重新分配由 malloc() 方法分配的内存。它不重新分配内存。

结论

总之,malloc() 函数和 new 操作符都用于在运行时动态分配内存。然而,这些函数在使用和功能上存在显著差异。malloc() 函数是一个 C 风格的库函数,需要手动类型转换,并且不调用构造函数。另一方面,new 操作符提供了类型安全、面向对象的特性,并自动为对象调用构造函数。

malloc 和 new 区别 FAQ

1) C++ 中 malloc 和 new 的主要区别是什么?

malloc 和 new 的主要区别在于,malloc 是 C 语言中的库函数。另一方面,new 是一个操作符。

2) C++ 中 malloc 和 new 的内存如何释放?

使用 malloc() 函数分配的内存应使用 free() 函数释放。另一方面,使用 new 操作符分配的内存应使用 delete() 释放。

3) malloc 和 new 中哪个更具类型安全性?

new 操作符更具类型安全性,因为它不需要类型转换。另一方面,malloc() 函数不具类型安全性,因为它返回 void*(指针)。

4) C++ 中是否有关于失败的异常?

当 malloc() 函数失败时,它返回 NULL。另一方面,当 new 操作符失败时,它会抛出 std::bad_alloc 异常。

5) 在 C++ 中应该使用哪个?

这两个函数都可以根据用户的需求使用。new 操作符很有用,因为它支持构造函数、类型安全和面向对象特性。另一方面,malloc() 函数主要在 C 语言中使用。