new和malloc()之间的区别
内容
new和malloc()都用于动态分配内存。但是,new和malloc()在许多缺点上有所不同。 new和malloc()之间的主要区别是 新 是运算符,用作构造函数。另一方面, malloc() 是标准的库函数,用于在运行时分配内存。两者之间的其他区别将在下面的比较表中讨论:
- 比较表
- 定义
- 关键差异
- 结论
比较表
比较基础 | 新 | 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()需要更多时间来执行。
- new运算符是C ++中引入的一种构造,并在Java,C#等中使用。另一方面,malloc()是仅在C语言中发现并受C ++支持的标准库函数。
- new运算符为指定类型的对象分配了足够的内存,因此,它不需要调整大小的运算符。另一方面,malloc()函数需要sizeof()运算符,以使该函数知道必须分配的内存大小。
- 新的运算符可以在声明时调用对象的构造函数。另一方面,malloc()函数不能调用构造函数。
- 运算符“ new”可能会重载,但malloc()不会。
- 如果new运算符未能分配内存,则它将引发必须由代码处理的异常,否则程序将终止。另一方面,如果malloc()函数未能分配内存,则会返回NULL指针。如果不检查就使用了指针,则将导致系统崩溃。
- 使用新运算符分配的内存可以使用“删除”进行释放。另一方面,可以使用free()释放使用malloc()函数分配的内存。
- 使用新的运算符分配内存后,无论如何都无法调整大小。另一方面,可以使用realloc()函数重新分配(调整大小)使用malloc()函数分配的内存。
- 与malloc()相比,new的执行时间更少,因为malloc是一个函数,而new是一个构造。
结论:
malloc()函数是动态分配内存的旧方法。如今,新操作符用于在运行时分配内存,因为它比malloc()具有某些优势。