📅  最后修改于: 2020-10-16 06:48:52             🧑  作者: Mango
C++中的malloc()和new都用于相同的目的。它们用于在运行时分配内存。但是,malloc()和new具有不同的语法。 malloc()和new之间的主要区别是new是运算符,而malloc()是在stdlib头文件中预定义的标准库函数。
新的是内存分配运算符,用于在运行时分配内存。由new运算符初始化的内存在堆中分配。它返回内存的起始地址,该地址被分配给变量。 C++中new运算符的功能类似于C编程语言中使用的malloc()函数。 C++也与malloc()函数兼容,但是由于其优势,因此经常使用new运算符。
新运算符的语法
type variable = new type(parameter_list);
用上面的语法
类型:定义新运算符为其分配内存的变量的数据类型。
变量:它是指向内存的变量的名称。
parameter_list:这是初始化为变量的值的列表。
new运算符不使用sizeof()运算符分配内存。它还不使用调整大小,因为new运算符为对象分配了足够的内存。它是一种在声明时调用构造函数以初始化对象的构造。
我们知道new运算符在堆中分配内存;如果内存在堆中不可用,并且new运算符尝试分配内存,则会引发异常。如果我们的代码无法处理该异常,则该程序将异常终止。
让我们通过一个例子来理解新的运算符。
#include
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;
}
输出:
malloc()是在运行时分配内存的函数。该函数返回void指针,这意味着可以将其分配给任何指针类型。可以进一步对该void指针进行类型转换,以获取指向指定类型的内存的指针。
下面给出了malloc()函数的语法:
type variable_name = (type *)malloc(sizeof(type));
哪里,
类型:它是必须为其分配内存的变量的数据类型。
variable_name:它定义指向内存的变量的名称。
(type *):它用于类型转换,以便我们可以获得指向内存的指定类型的指针。
sizeof():在malloc()函数使用sizeof()运算符来获取分配所需的内存大小。
注意:malloc()函数返回void指针,因此需要进行类型转换以将不同的类型分配给指针。在malloc()函数需要sizeof()运算符,因为malloc()函数返回原始内存,因此sizeof()运算符将告诉malloc()函数分配所需的内存量。
如果没有足够的内存,则可以使用realloc()函数调整内存大小。众所周知,所有动态内存需求都是使用堆内存来满足的,因此malloc()函数还会在堆中分配内存并返回指向它的指针。堆内存非常有限,因此当我们的代码开始执行时,它会标记正在使用的内存,而当我们的代码完成其任务时,则会使用free()函数释放内存。如果没有足够的内存,并且我们的代码尝试访问该内存,则malloc()函数将返回NULL指针。可以使用free()函数释放由malloc()函数分配的内存。
让我们通过一个例子来理解。
#include
#include
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> *(ptr+i);
}
std::cout << "Entered elements are : " << std::endl;
for(int i=0;i
输出:
如果未在正确的位置使用free()函数,则可能导致指针悬空的原因。让我们通过一个例子来了解这种情况。
#include
#include
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指的是指针未指向的内存。
到目前为止,我们已经了解了新的运算符和malloc()函数。现在,我们将看到new运算符和malloc()函数之间的区别。
新运算符的语法
type reference_variable = new type name;
哪里,
type:定义参考变量的数据类型。
reference_variable:它是指针变量的名称。
新增:它是用于分配内存的运算符。
类型名称:可以是任何基本数据类型。
例如,
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’变量中。