C++ malloc

C++ malloc 首页 / C++入门教程 / C++ malloc

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

new运算符

new的是内存分配运算符,用于在运行时分配内存,由new运算符初始化的内存在堆中分配。它返回内存的起始地址,该地址被分配给变量。 C++中new运算符的功能类似于 C编程语言 C++ 也与malloc()函数兼容,但是由于其优势,因此经常使用new运算符。

 type variable = new type(parameter_list);

type                        -  它定义了新操作符为其分配内存的变量的数据类型。

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

parameter_list  -  这是初始化为变量的值的列表。

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

我们知道new运算符在堆中分配内存;如果内存在堆中不可用,并且new运算符尝试分配内存,则会引发异常。如果我们的代码无法处理该异常,则该程序将异常终止。

通过示例让我们了解new 运算符。

#include <iostream>
using namespace std;
int main()
{
 int *ptr; //整数指针变量声明
 ptr=new int;//将内存分配给指针变量 ptr。
 std::cout << "Enter the number : " << std::endl;
 std::cin >>*ptr;
 std::cout << "Entered number is " <<*ptr<< std::endl;
return 0;
}

输出:

malloc() vs new in C++

什么是malloc()?

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

下面给出了malloc()函数的语法:

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

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

variable_name  -  它定义指向内存的变量的名称。

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

sizeof()                  -  在malloc()函数中使用sizeof()运算符可获取分配所需的内存大小。

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

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

通过示例让我们理解。

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

int main()
{
   
  int len;  //变量声明
  std::cout << "Enter the count of numbers :" << std::endl;
  std::cin >> len;
  int *ptr;//指针变量声明
  ptr=(int*) malloc(sizeof(int)*len); //将内存分配给指针变量
  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;
}

输出:

malloc() vs new in C++

如果未在正确的位置使用 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区别

malloc() vs new in C++
  • new操作符构造一个对象,即,它调用构造函数以初始化对象,而 malloc()函数不调用构造函数。 new运算符调用构造函数,而delete运算符调用析构函数以销毁对象。这是malloc()与new之间的最大区别。
  • new函数是运算符,而malloc()是stdlib头文件中的预定义函数。
  • new运算符可以重载,而malloc()函数不能重载。
  • 如果堆中没有足够的内存,那么当malloc()函数返回NULL指针时,new运算符将引发异常。
  • 在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'变量中。

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

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

邱岳的产品手记 -〔邱岳〕

技术领导力实战笔记 -〔TGO鲲鹏会〕

深入拆解Java虚拟机 -〔郑雨迪〕

如何做好一场技术演讲 -〔极客时间〕

Java业务开发常见错误100例 -〔朱晔〕

容量保障核心技术与实战 -〔吴骏龙〕

零基础学Python(2023版) -〔尹会生〕

AI绘画核心技术与实战 -〔南柯〕

结构执行力 -〔李忠秋〕

好记忆不如烂笔头。留下您的足迹吧 :)