C++ 中的 Malloc() 与 New


2022年11月8日, Learn eTutorial
2084

在 C++ 编程中,malloc() 和 new 运算符都用于动态分配堆内存,主要用于变量和对象,但它们的方式不同。malloc 和 new 有何不同?在本教程中,让我们讨论 mallocnew 之间的主要区别。

malloc 和 new 之间的区别

在 C++ 中,使用 new 和 malloc() 都可以实现相同的功能。它们用于在运行时分配内存。但是,malloc() 和 new 的语法不同。new 和 malloc() 之间的主要区别在于 new 是一个运算符,而 malloc() 是一个预定义的标准库函数,它位于 stdlib 头文件中。

基于比较

New

MALLOC()

性质

它是一个运算符

它是一个函数

语言

运算符 new 被认为是 C++、Java 和 C# 的独特特性。

malloc() 函数是 C 语言的一个特性。

构造函数

可以使用运算符 new 调用对象的构造函数。

Malloc() 不能调用任何构造函数。

sizeof()

new 不需要 sizeof 运算符,因为它为特定类型分配足够的内存。

为了让 malloc 确定分配多少内存,它需要 sizeof 运算符。

初始化

 

 

在为对象分配内存时,new 运算符可以初始化对象。

Malloc 无法执行内存初始化。

重载

 

可以重载运算符 new。

不允许重载 malloc()。

解除分配

 

 

使用 new 分配的内存使用“delete”解除分配。

free() 函数主要用于解除分配 malloc() 分配的内存。

重新分配

new 运算符不重新分配内存。

malloc() 分配的内存可以使用 realloc() 重新分配。

失败

如果运算符 new 失败,它会抛出异常。

如果 malloc() 失败,它将返回 NULL。

 

执行

new 运算符减少了执行时间。

malloc() 的执行时间更长。

new 和 malloc 的定义是什么?

new

内存由运算符 new 动态分配。new 运算符将分配堆内存并返回该特定内存的初始地址,该地址被分配给引用变量。C 中的 Malloc() 与 new 运算符类似。尽管 malloc() 函数与 C++ 编译器兼容,但最好使用 new 运算符,因为它比 malloc() 具有一些优势。

我们知道堆的大小是有限的,new 运算符会给它分配内存。因此,如果堆内存不足并且 new 运算符试图分配内存,它就会失败。如果 new 运算符无法分配内存,它肯定会抛出异常,如果您的程序代码无法处理该异常,那么程序将意外终止。delete 运算符可用于释放 new 运算符分配的内存。由于 new 运算符是运算符而不是函数,因此它减少了执行时间。

要了解有关 C++ 中 new 运算符的更多信息,请查看 C++ 内存管理教程

Malloc

要向堆分配指定数量的内存,请使用 malloc() 函数。该方法将返回一个“void”类型的指针,然后将其类型转换为给定类型的内存指针,然后将其分配给引用变量。由于 malloc() 用于动态分配内存,因此它与 C++ 中的 new 运算符类似。Malloc() 是一种标准库函数。

语法


type variable_name = (type *) malloc ( sizeof ( type ) );


在这种情况下,“type”表示需要分配内存的变量的数据类型。malloc() 返回的指针将分配给名为 variable_name 的引用变量。(type*) 指定如何进行类型转换以获取特定类型内存的指针。sizeof() 函数向 malloc() 解释需要多少内存。
由于 malloc() 函数返回的指针是 void 类型,因此需要进行类型转换以将类型分配给指针。由于 malloc() 函数分配原始内存,因此有必要通过使用 sizeof() 方法通知该函数必须分配特定数量的内存。如果分配的内存不足,可以使用 realloc() 扩大或重新分配内存。

堆上的内存使用 malloc() 函数分配。如果堆内存不足,malloc() 方法将返回 NULL 指针。为了避免系统崩溃,在使用 malloc() 返回的指针之前,应该验证包含该指针的引用变量。

free() 用于解除分配 malloc() 函数分配的内存。Malloc() 的执行时间更长,因为函数调用会导致开销。

new 和 malloc 之间非常重要的关键区别需要记住

  • new 运算符是基于 C++ 的概念,也用于 Java、C# 和其他语言。相反,标准库函数 malloc() 仅在 C 语言中可用,并受 C++ 支持。
  • 由于 new 运算符为指定类型的对象分配足够的内存,因此它不需要大小运算符。但是,为了让 malloc() 函数知道要分配多少内存,它需要 sizeof() 运算符。
  • 在声明对象时,new 运算符能够调用对象的构造函数。另一方面,malloc() 函数无法调用构造函数。
  • Malloc() 不能重载,但运算符“new”可以。
  • 如果内存分配失败,代码必须处理 new 运算符抛出的异常;否则,程序将失败。另一方面,如果 malloc() 函数无法分配内存,它将返回 NULL 指针。如果未先验证此指针就使用它,系统将崩溃。
  • “delete”可用于解除分配使用 new 运算符分配的内存。另一方面,free() 函数可以解除分配使用 malloc() 函数分配的内存。
  • 一旦通过 new 运算符分配了内存,就无法以任何方式调整其大小。另一方面,使用 malloc() 方法分配的内存可以使用 realloc() 函数重新分配(调整大小)。
  • 鉴于 malloc() 是一个函数而 new 是一个构造,new 的执行时间比 malloc 短。

结论

malloc() 函数是动态分配内存的传统方法。如今,由于其优于 malloc() 的一些优势,new 运算符被用于在运行时分配内存。