C++ 中的malloc ()和 new 都用于相同的目的。它们用于在运行时分配内存。但是,malloc() 和 new 有不同的语法。malloc() 和 new 之间的主要区别是 new 是一个运算符,而 malloc() 是一个在stdlib头文件中预定义的标准库函数。
new是一个内存分配操作符,用于在运行时分配内存。new 操作符初始化的内存分配在堆中。它返回分配给变量的内存的起始地址。C++ 中new 运算符的功能类似于C 编程语言中使用的 malloc() 函数。C++也与 malloc() 函数兼容,但 new 运算符因其优点而被大多数人使用。
新运算符的语法
type variable = new type(parameter_list);
在上面的语法中
type:它定义了新运算符为其分配内存的变量的数据类型。
variable:是指向内存的变量名。
parameter_list:它是初始化为变量的值列表。
new 运算符不使用 sizeof() 运算符来分配内存。它也不使用调整大小,因为新运算符为对象分配了足够的内存。它是一种在声明时调用构造函数来初始化对象的构造。
众所周知,new 运算符在堆中分配内存;如果内存在堆中不可用并且 new 运算符尝试分配内存,则抛出异常。如果我们的代码无法处理异常,那么程序就会异常终止。
让我们通过一个例子来理解 new 运算符。
#include <iostream> using namespace std; int main() { int *ptr; //整型指针变量声明 ptr=new int; // 为指针变量 ptr 分配内存。 std::cout << "请输入数字:" << std::endl; std::cin >>*ptr; std::cout << "输入的数字是 " <<*ptr<< std::endl; return 0; }
输出:
malloc() 是一个在运行时分配内存的函数。这个函数返回空指针,这意味着它可以被赋值给任何指针类型。这个void指针可以进一步进行类型转换,得到指向指定类型内存的指针。
malloc() 函数的语法如下:
type variable_name = (type *)malloc(sizeof(type));
在哪里,
类型:它是必须为其分配内存的变量的数据类型。
variable_name:定义指向内存的变量名。
(type*):用于类型转换,以便我们可以得到指向内存的指定类型的指针。
sizeof(): sizeof() 运算符用于 malloc() 函数中,用于获取分配所需的内存大小。
如果没有足够的内存可用,则可以使用 realloc() 函数调整内存大小。正如我们所知,所有动态内存需求都是使用堆内存满足的,因此 malloc() 函数也在堆中分配内存并返回指向它的指针。堆内存非常有限,所以当我们的代码开始执行时,它会标记正在使用的内存,当我们的代码完成其任务时,它会使用 free() 函数释放内存。如果没有足够的内存可用,而我们的代码试图访问内存,则 malloc() 函数返回 NULL 指针。由 malloc() 函数分配的内存可以使用 free() 函数释放。
让我们通过一个例子来理解。
#include <iostream> #include<stdlib.h> using namespace std; int main() { int len; // 变量声明 std::cout << "请输入数字的个数:" << std::endl; std::cin >> len; int *ptr; // 指针变量声明 ptr=(int*) malloc(sizeof(int)*len); // 为指针变量分配内存 for(int i=0;i<len;i++) { std::cout << "请输入数字:" << std::endl; std::cin >> *(ptr+i); } std::cout << "输入的元素是:" << std::endl; for(int i=0;i<len;i++) { std::cout << *(ptr+i) << std::endl; } free(ptr); return 0; }
输出:
如果我们没有在正确的地方使用free()函数,那么它就会导致悬空指针的产生。让我们通过一个例子来理解这个场景。
#include <iostream> #include<stdlib.h> using namespace std; int *func() { int *p; p=(int*) malloc(sizeof(int)); free(p); return p; } int main() { int *ptr; ptr=func(); free(ptr); return 0; }
在上面的代码中,我们调用了 func() 函数。func() 函数返回整数指针。在 func() 函数内部,我们声明了一个 *p 指针,并使用 malloc() 函数将内存分配给这个指针变量。在这种情况下,我们将返回其内存已被释放的指针。ptr 是一个悬挂指针,因为它指向已释放的内存位置。或者我们可以说 ptr 指的是指针未指向的内存。
到现在为止,我们了解了 new 运算符和 malloc() 函数。现在,我们将看到 new 运算符和 malloc() 函数之间的区别。
new操作符构造一个对象,即调用构造函数来初始化一个对象,而malloc()函数不调用构造函数。new 运算符调用构造函数,delete 运算符调用析构函数来销毁对象。这是 malloc() 和 new 之间最大的区别。
new 是一个运算符,而 malloc() 是 stdlib 头文件中的预定义函数。
operator new 可以被重载,而 malloc() 函数不能被重载。
如果堆中没有足够的可用内存,则 new 运算符将在 malloc() 函数返回 NULL 指针时抛出异常。
在 new 运算符中,我们需要指定要分配的对象数,而在 malloc() 函数中,我们需要指定要分配的字节数。
对于 new 运算符,我们必须使用 delete 运算符来释放内存。但是在 malloc() 函数的情况下,我们必须使用 free() 函数来释放内存。
新运算符的语法
type reference_variable = new type name;
在哪里,
type:定义引用变量的数据类型。
reference_variable:它是指针变量的名称。
new:是用于分配内存的操作符。
类型名称:可以是任何基本数据类型。
例如
int *p; p = new int;
在上面的语句中,我们声明了一个整型指针变量。语句p = new int; 为整型变量分配内存空间。
malloc() 的语法如下:
int *ptr = (data_type*) malloc(sizeof(data_type));
ptr:它是一个指针变量。
data_type:可以是任何基本数据类型。
例如
int *p; p = (int *) malloc(sizeof(int))
上面的语句会在堆中为一个整数变量分配内存,然后将保留内存的地址存储在'p'变量中。
另一方面,可以使用 free() 函数释放使用 malloc() 函数分配的内存。
一旦使用 new 运算符分配了内存,就无法调整它的大小。另一方面,内存是使用 malloc() 函数分配的;然后,可以使用 realloc() 函数重新分配它。
new 的执行时间少于 malloc() 函数,因为 new 是一个构造,而 malloc 是一个函数。
new 运算符不返回单独的指针变量;它返回新创建的对象的地址。另一方面,malloc() 函数返回 void 指针,可以将其进一步类型转换为指定类型。