malloc/free与new/delete的区别

malloc/free与new/delete的区别:

相同点:都可用于动态内存分配与释放

不同点:

1):操作对象有所不同。

malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符

由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,所以无法执行构造函数和析构函数;

new的执行过程:

//new的执行过程:
1:首先调用名为operator new的标准库函数,分配足够大的原始的未类型化的内存,用来保存指定类型的一个对象;
2:接下来,运行该类型的一个构造函数,用指定初始化式构造对象;
3:最后返回指向新分配并构造的对象的指针。

delete的执行过程:

1:首先,对sp指向的对象运行适当的析构函数2:然后,用过调用名为operator delete的标准库函数释放该对象所用内存。

以上operator new 与 operator delete 分别对应于malloc 与free。

2):用法上也有所不同:

函数malloc的原型如下:

void *malloc(size_t size);

用malloc申请一块长度为lengh的整形类型的内存,程序如下:

int *p = (int*)malloc( sizeof(int) *length);
1:malloc返回值的类型为void*,所以在调用malloc时要显式地进行类型转换,将void*转换成所需要的指针类型;
2:malloc函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数

函数free的原型如下:

void free(void *memblock);
语句free(p)用来释放内存,如果p为NULL指针,那么无论free对p进行多少次操作都不会出现问题;
如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。

运算符new使用起来就比函数malloc简单多了,例如:

int *p2 = new int[length];

这是因为new内置了sizeof、类型转换和类型安全检查功能,对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作(调用构造函数)。
如果用new创建数组,那么只能使用对象的无参数构造函数。例如:

Obj *objects = new Obj[100];//创建100个动态对象

不能写成:

Obj *objects = new Obj[100](1);//创建100个动态对象并同时赋值为1 ERROR

在用delete释放对象数组时,留意不要丢了符号"[]"。例如:

delete []objects;//正确的用法
delete objects;//错误的用法

总结:

1):malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符

2):new自动计算需要分配的空间,而malloc需要手工计算计算字节数;

3):new是类型安全的,而malloc不是;例如:

int *p = new float[2];//编译时指出错误
int *p = (int*)malloc(2*sizeof(float));//编译时无法指出错误

4);new调用operator new分配足够的空间,并调用相关对象的构造函数,而malloc不能调用构造函数;

delete调用相关对象的析构函数,然后调用operator delete以释放空间,而malloc不能调用析构函数;

5):malloc/free需要库文件支持,new/delete则不需要。

原文地址:https://www.cnblogs.com/xfxu/p/4086818.html