C++ malloc() vs new in

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

什么是新的?

new是一个内存分配操作符,用于在运行时分配内存。new 操作符初始化的内存分配在堆中。它返回分配给变量的内存的起始地址。C++ 中new 运算符的功能类似于C 编程语言中使用的 malloc() 函数。C++也与 malloc() 函数兼容,但 new 运算符因其优点而被大多数人使用。

新运算符的语法

句法 (Syntax)

type variable = new type(parameter_list);

在上面的语法中

type:它定义了新运算符为其分配内存的变量的数据类型。

variable:是指向内存的变量名。

parameter_list:它是初始化为变量的值列表。

new 运算符不使用 sizeof() 运算符来分配内存。它也不使用调整大小,因为新运算符为对象分配了足够的内存。它是一种在声明时调用构造函数来初始化对象的构造。

众所周知,new 运算符在堆中分配内存;如果内存在堆中不可用并且 new 运算符尝试分配内存,则抛出异常。如果我们的代码无法处理异常,那么程序就会异常终止。

让我们通过一个例子来理解 new 运算符。

例子 (Example)

#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;  
}

输出:

c++ 中的 malloc() 与 new

什么是 malloc()?

malloc() 是一个在运行时分配内存的函数。这个函数返回空指针,这意味着它可以被赋值给任何指针类型。这个void指针可以进一步进行类型转换,得到指向指定类型内存的指针。

malloc() 函数的语法如下:

例子 (Example)

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

在哪里,

类型:它是必须为其分配内存的变量的数据类型。

variable_name:定义指向内存的变量名。

(type*):用于类型转换,以便我们可以得到指向内存的指定类型的指针。

sizeof(): sizeof() 运算符用于 malloc() 函数中,用于获取分配所需的内存大小。

注意:malloc() 函数返回 void 指针,因此需要进行类型转换才能为指针分配不同的类型。malloc() 函数中需要 sizeof() 运算符,因为 malloc() 函数返回原始内存,因此 sizeof() 运算符将告诉 malloc() 函数分配需要多少内存。

如果没有足够的内存可用,则可以使用 realloc() 函数调整内存大小。正如我们所知,所有动态内存需求都是使用堆内存满足的,因此 malloc() 函数也在堆中分配内存并返回指向它的指针。堆内存非常有限,所以当我们的代码开始执行时,它会标记正在使用的内存,当我们的代码完成其任务时,它会使用 free() 函数释放内存。如果没有足够的内存可用,而我们的代码试图访问内存,则 malloc() 函数返回 NULL 指针。由 malloc() 函数分配的内存可以使用 free() 函数释放。

让我们通过一个例子来理解。

例子 (Example)

#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;  
}

输出:

c++ 中的 malloc() 与 new

如果我们没有在正确的地方使用free()函数,那么它就会导致悬空指针的产生。让我们通过一个例子来理解这个场景。

例子 (Example)

#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() 函数之间的区别。

malloc() 和 new 之间的区别

  • new操作符构造一个对象,即调用构造函数来初始化一个对象,而malloc()函数不调用构造函数。new 运算符调用构造函数,delete 运算符调用析构函数来销毁对象。这是 malloc() 和 new 之间最大的区别。

  • new 是一个运算符,而 malloc() 是 stdlib 头文件中的预定义函数。

  • operator new 可以被重载,而 malloc() 函数不能被重载。

  • 如果堆中没有足够的可用内存,则 new 运算符将在 malloc() 函数返回 NULL 指针时抛出异常。

  • 在 new 运算符中,我们需要指定要分配的对象数,而在 malloc() 函数中,我们需要指定要分配的字节数。

  • 对于 new 运算符,我们必须使用 delete 运算符来释放内存。但是在 malloc() 函数的情况下,我们必须使用 free() 函数来释放内存。

新运算符的语法

例子 (Example)

type reference_variable = new type name;

在哪里,

type:定义引用变量的数据类型。

reference_variable:它是指针变量的名称。

new:是用于分配内存的操作符。

类型名称:可以是任何基本数据类型。

例如

例子 (Example)

int *p;  
p = new int;

在上面的语句中,我们声明了一个整型指针变量。语句p = new int; 为整型变量分配内存空间。

malloc() 的语法如下:

例子 (Example)

int *ptr = (data_type*) malloc(sizeof(data_type));

ptr:它是一个指针变量。

data_type:可以是任何基本数据类型。

例如

例子 (Example)

int *p;  
p = (int *) malloc(sizeof(int))

上面的语句会在堆中为一个整数变量分配内存,然后将保留内存的地址存储在'p'变量中。

  • 另一方面,可以使用 free() 函数释放使用 malloc() 函数分配的内存。

  • 一旦使用 new 运算符分配了内存,就无法调整它的大小。另一方面,内存是使用 malloc() 函数分配的;然后,可以使用 realloc() 函数重新分配它。

  • new 的执行时间少于 malloc() 函数,因为 new 是一个构造,而 malloc 是一个函数。

  • new 运算符不返回单独的指针变量;它返回新创建的对象的地址。另一方面,malloc() 函数返回 void 指针,可以将其进一步类型转换为指定类型。


  • 使用社交账号登录,本站支持
全部评论(0)