new和malloc的区别深入解析
在C++中,我们经常使用 new
和 malloc
来分配内存空间,但是二者有着一些区别。本文将深入分析 new
和 malloc
的区别,并且提供两个对比性的示例。
new
和 malloc
的区别
- 内存分配方式不同:
new
是运算符,而malloc
是C语言中的一个函数。 - 分配内存的类型不同:
new
是 C++ 内存分配器,会在内存中创建一个对象并返回其指针,而malloc
只分配一段内存,并不创建对象,需要手动调用构造函数初始化对象。 - 处理内存溢出的方式不同: 当
new
内存分配失败时,会抛出std::bad_alloc
异常,而malloc
在分配失败时会返回空指针NULL
(C++中可以使用std::nothrow
避免抛出异常)。 - 内存大小不同:
new
会自动计算需要分配的内存大小,malloc
则需要手动给定分配的内存大小。 - 可以直接重载operator new进行自定义内存分配,而malloc并不能自定义内存分配方式
示例1:使用 new 和 malloc 分别分配并初始化一个 int 数组
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int *pnData1 = new int[5];
int *pnData2 = (int*) malloc(5 * sizeof(int));
for(int i=0; i<5; i++)
{
pnData1[i] = i;
pnData2[i] = i;
}
cout << "Displaying the values of the array allocated using 'new'" << endl;
for(int i=0; i<5; i++)
{
cout << pnData1[i] << endl;
}
cout << "Displaying the values of the array allocated using 'malloc'" << endl;
for(int i=0; i<5; i++)
{
cout << pnData2[i] << endl;
}
delete[] pnData1;
free(pnData2);
_getch();
return 0;
}
在上述代码中,我们使用了 new
运算符和 malloc
函数来分别分配并初始化一个包含五个元素的 int
数组。然后,我们分别使用 for
循环对两个数组进行初始化。最后,我们对两个数组进行遍历,并将它们的值输出到控制台上。
在这个示例中,我们可以看到,使用 new
运算符分配数组时,我们不需要显式地给出数组的大小。而使用 malloc
函数时,我们必须手动计算内存分配空间大小。在释放内存时也有所不同。我们必须使用 delete
运算符来释放由 new
分配的内存,而使用 free
函数来释放由 malloc
分配的内存。
示例2:使用 new 和 malloc 分别分配并初始化一个 string 对象
#include <iostream>
#include <string.h>
#include <conio.h>
using namespace std;
class Person
{
public:
char *name;
int age;
public:
Person(){};
~Person(){};
};
int main()
{
Person *p1 = new Person();
strcpy(p1->name, "Arya Stark");
p1->age = 18;
Person *p2 = (Person*) malloc(sizeof(Person));
strcpy(p2->name, "Sansa Stark");
p2->age = 20;
cout << "Displaying the values of the Person created using 'new' : " << endl;
cout << "Name: " << p1->name << endl;
cout << "Age: " << p1->age << endl;
cout << "Displaying the values of the Person created using 'malloc' : " << endl;
cout << "Name: " << p2->name << endl;
cout << "Age: " << p2->age << endl;
delete p1;
free(p2);
_getch();
return 0;
}
在这个示例中,我们使用 new
运算符和 malloc
函数分别分配并初始化了一个 Person
类型的对象。 然后,我们使用 strcpy
函数为 name
成员赋值,将 age
的值设置为 18
。 最后,我们采用 cout
对象将对象的属性输出到控制台。
在这个示例中,我们可以看到 new
运算符为类对象的分配和初始化提供了更高级别的抽象。 我们使用 destructor
函数和运算符“ delete
”来释放由 new
分配的内存。使用 free
函数和运算符" new
"释放内存在各自的协调中,不能通用。
总结:在C++中使用 new
和 delete
运算符进行内存分配和释放是常见的方法;而 malloc
和 free
函数通常与C语言相关的库相关联,但如果你需要在C ++中进行内存分配,则可以使用它们。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:new和malloc的区别深入解析 - Python技术站