C++教程-malloc()与new在C++中的区别
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;
}
输出:
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;
}
输出结果:
如果我们没有在正确的位置使用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之间最大的区别。
- 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 指针,可以进一步将其类型转换为指定类型。