首页 > 代码库 > malloc/free与new/delete的区别
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则不需要。
malloc/free与new/delete的区别