C++ malloc() vs new

C++ malloc() vs new

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

什么是new

new是一个内存分配运算符,用于在运行时分配内存。new运算符分配的内存初始化后存储在堆中。它返回内存的起始地址,并将其分配给变量。new运算符在C++中的功能类似于在C编程语言中使用的malloc()函数。C++也兼容malloc()函数,但new运算符由于它的优势而被广泛使用。

new运算符的语法

 type variable = new type(parameter_list);

在上述语法中

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

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

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

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

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

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

#include <iostream>
using namespace std;
int main()
{
 int *ptr;  // integer pointer variable declaration
 ptr=new int; // allocating memory to the pointer variable ptr.
 std::cout << "Enter the number : " << std::endl;
 std::cin >>*ptr;
 std::cout << "Entered number is " <<*ptr<< std::endl;
return 0;
}

输出:

C++ malloc() vs new

什么是malloc()

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

malloc()函数的语法如下所示:

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

其中

type: // 类型 它是要分配内存的变量的数据类型。

variable_name: // 变量名 它定义了指向内存的变量的名称。

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

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

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

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

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

#include <iostream>
#include<stdlib.h>
using namespace std;

int main()
{

  int len;   // variable declaration
  std::cout << "Enter the count of numbers :" << std::endl;
  std::cin >> len;
  int *ptr; // pointer variable declaration
  ptr=(int*) malloc(sizeof(int)*len);  // allocating memory to  the poiner variable
  for(int i=0;i<len;i++)
  {
      std::cout << "Enter a number : " << std::endl;
      std::cin >> *(ptr+i);
  }
  std::cout << "Entered elements are : " << std::endl;
   for(int i=0;i<len;i++)
  {
     std::cout << *(ptr+i) << std::endl;
  }
free(ptr);
    return 0;
}

输出:

C++ malloc() vs new

如果我们在正确的位置不使用 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()函数之间的区别。

malloc()和new之间的区别

C++ malloc() vs new

  • new运算符构造一个对象,即调用构造函数来初始化对象,而 malloc() 函数不调用构造函数。new运算符调用构造函数,delete运算符调用析构函数来销毁对象。这是malloc()和new之间最大的区别。
  • new是一个运算符,而malloc()是stdlib头文件中的预定义函数。
  • 运算符new可以重载,而malloc()函数不能重载。
  • 如果堆中没有足够的内存可用,则new运算符会抛出异常,而malloc()函数会返回一个NULL指针。
  • 在new运算符中,我们需要指定要分配的对象的数量,而在malloc()函数中,我们需要指定要分配的字节数。
  • 在使用new运算符时,我们必须使用delete运算符来释放内存。但是在使用malloc()函数时,我们必须使用free()函数来释放内存。

new运算符的语法

type reference_variable = new type name;

其中,

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

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

new: 它是用于分配内存的运算符。

type name: 它可以是任何基本数据类型。

例如,

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’ 变量中。

  • 另一方面,使用 malloc() 函数分配的内存可以使用 free() 函数释放。
  • 一旦使用 new 运算符分配内存,就无法调整大小。另一方面,使用 malloc() 函数分配的内存可以使用 realloc() 函数重新分配。
  • new 的执行时间比 malloc() 函数少,因为 new 是一个构造,而 malloc 是一个函数。
  • new 运算符不返回独立的指针变量,它返回新创建对象的地址。另一方面,malloc() 函数返回 void 指针,可以进一步转换为指定类型。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程