malloc()与new在C++中的区别

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

new是什么?

new是一个内存分配运算符,用于在运行时分配内存。new运算符分配的内存位于堆中。它返回内存的起始地址,并将其分配给变量。C++中的new运算符的功能类似于C语言中使用的malloc()函数。C++也兼容malloc()函数,但由于new运算符具有优势,因此通常更常用。

new运算符的语法

类型 变量名 = new 类型(参数列表); 

在上述语法中,

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

变量名:指向内存的变量名称。

参数列表:初始化变量的值的列表。

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

由于new运算符在堆中分配内存,如果堆中没有足够的内存,而new运算符尝试分配内存,则会引发异常。如果我们的代码无法处理异常,则程序将异常终止。

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

#include <iostream> 
using namespace std; 
int main() 
{ 
  int *ptr; // 整型指针变量声明 
  ptr = new int; // 分配内存给指针变量
  ptr cout << "请输入数字:" << endl; 
  cin >> *ptr; 
  cout << "输入的数字是:" << *ptr << endl; 
  return 0; 
} 

输出:

1.png

malloc()是什么?

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

malloc()函数的语法如下:

类型 *变量名 = (类型 *)malloc(sizeof(类型)); 

其中,

类型:要分配内存的变量的数据类型。

变量名:指向内存的变量名称。

(类型*):用于类型转换,以便获得指向特定类型内存的指针。

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

注意: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; // 变量声明    
  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;
} 

输出结果:

2.png

如果我们没有在正确的位置使用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之间的区别 new运算符会构造一个对象,即调用构造函数来初始化对象,而malloc()函数不会调用构造函数。new运算符调用构造函数,而delete运算符调用析构函数来销毁对象。这是

malloc()和new之间最大的区别。

3.png

  • 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 指针,可以进一步将其类型转换为指定类型。

标签: C++语言, C++语言教程, C++语言技术, C++语言学习, C++语言学习教程, C++语言下载, C++语言开发, C++语言入门教程, C++语言进阶教程, C++语言高级教程, C++语言面试题, C++语言笔试题, C++语言编程思想