new和malloc()之间的区别

作者: Laura McKinney
创建日期: 1 四月 2021
更新日期: 5 可能 2024
Anonim
千锋物联网教程:4 20 new delete与malloc的区别
视频: 千锋物联网教程:4 20 new delete与malloc的区别

内容


new和malloc()都用于动态分配内存。但是,new和malloc()在许多缺点上有所不同。 new和malloc()之间的主要区别是 是运算符,用作构造函数。另一方面, malloc() 是标准的库函数,用于在运行时分配内存。两者之间的其他区别将在下面的比较表中讨论:

  1. 比较表
  2. 定义
  3. 关键差异
  4. 结论

比较表

比较基础malloc()
语言new运算符是C ++,Java和C#的特定功能。 函数malloc()是C的功能。
性质“新”是一个运算符。malloc()是一个函数。
sizeof()new不需要sizeof运算符,因为它为特定类型分配了足够的内存 malloc要求sizeof运算符知道其必须分配的内存大小。
建设者 运算符new可以调用对象的构造函数。malloc()根本不能调用构造函数。
初始化new运算符可以在为对象分配内存的同时初始化它。无法在malloc中完成内存初始化。
超载 新运算符可以重载。malloc()永远不能重载。
失败失败时,new运算符将引发异常。失败时,malloc()返回NULL。
解除分配内存分配由新的,使用“删除”释放。malloc()的内存分配使用free()函数释放。
重新分配new运算符不会重新分配内存。可以使用realloc()重新分配由malloc()分配的内存。
执行操作员新缩短了执行时间。malloc()需要更多的时间来执行。


新的定义

运营商 是动态分配内存的内存分配运算符。 new运算符在堆中分配内存,并返回分配给参考变量的该内存的起始地址。 new运算符类似于C中的malloc()。但是,C ++编译器与malloc()兼容,但是最好使用new运算符,因为它比malloc()具有某些优势。 new运算符的语法如下:

类型variable_name =新类型(parameter_list);

在此,“类型”表示必须为其分配存储器的变量的数据类型。单词“ variable_name”是赋予引用变量的名称,该引用变量保存指向内存的指针。此处的括号指定了构造函数的调用。 parameter_list是传递给构造函数以初始化新构造的对象的值的列表。

新运算符为特定类型的对象分配所需的足够内存。因此,它不需要sizeof()运算符,也不需要像malloc()一样使用realloc()重新分配内存来调整内存大小。新操作符是一个构造;它在声明时调用对象的构造函数,该声明通常用于初始化对象。

我们知道,新操作符在堆中分配内存,并且堆的大小受到限制。因此,如果堆内存不足,并且新操作员尝试分配内存,则将导致新操作员失败。如果new运算符未能分配内存,它将引发异常,并且如果您的代码无法处理该异常,则程序异常终止。

可以使用delete运算符释放由new运算符分配的内存。新的运算符缩短了执行时间,因为它是运算符而不是函数。

malloc()的定义

malloc() 是一个函数,用于在堆上分配请求的内存量。该方法返回“ void”类型的指针,进一步,将其类型转换为指向指定类型的内存的指针,并将该内存指针分配给引用变量。 malloc()函数类似于C ++中的new运算符,因为它用于动态分配内存。 malloc()是标准的库函数。 malloc()函数的语法如下:

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

此处,“类型”表示必须为其分配内存的变量的数据类型。 variable_name是将由malloc()返回的指针分配给的参考变量的名称。 (type *)描述类型转换以获取指向特定类型的内存的指针。 sizeof()描述malloc(),即所需的内存大小。


malloc()需要类型转换,因为malloc()返回的指针是void类型,因此,要为指针分配类型,则需要类型转换。 sizeof()是必需的,因为函数malloc()分配了一个原始内存,因此,需要告诉malloc()函数它必须分配的内存大小。如果分配的内存不足,则可以使用realloc()调整其大小或重新分配。

malloc()函数在堆上分配内存。如果堆内存不足,则malloc()函数将返回NULL指针。因此,在使用malloc()返回的包含指针的引用变量之前,应先对其进行检查,否则可能导致系统崩溃。

由malloc()函数分配的内存使用free()释放。由于函数调用会导致开销,因此malloc()需要更多时间来执行。

  1. new运算符是C ++中引入的一种构造,并在Java,C#等中使用。另一方面,malloc()是仅在C语言中发现并受C ++支持的标准库函数。
  2. new运算符为指定类型的对象分配了足够的内存,因此,它不需要调整大小的运算符。另一方面,malloc()函数需要sizeof()运算符,以使该函数知道必须分配的内存大小。
  3. 新的运算符可以在声明时调用对象的构造函数。另一方面,malloc()函数不能调用构造函数。
  4. 运算符“ new”可能会重载,但malloc()不会。
  5. 如果new运算符未能分配内存,则它将引发必须由代码处理的异常,否则程序将终止。另一方面,如果malloc()函数未能分配内存,则会返回NULL指针。如果不检查就使用了指针,则将导致系统崩溃。
  6. 使用新运算符分配的内存可以使用“删除”进行释放。另一方面,可以使用free()释放使用malloc()函数分配的内存。
  7. 使用新的运算符分配内存后,无论如何都无法调整大小。另一方面,可以使用realloc()函数重新分配(调整大小)使用malloc()函数分配的内存。
  8. 与malloc()相比,new的执行时间更少,因为malloc是一个函数,而new是一个构造。

结论:

malloc()函数是动态分配内存的旧方法。如今,新操作符用于在运行时分配内存,因为它比malloc()具有某些优势。