一、Malloc/free
1.Malloc的原型:(#include <malloc.h>)
Void * malloc(size_t size); // Void * malloc(unsigned int num_bytes);
如果分配失败,则返回NULL,否则返回申请内存的首地址。malloc本身并不识别要申请内存的类型(返回类型为void *),只关心内存的字节数,因此必须显式的进行类型转化。
2.Free的原型:
Void free(void *memblock);
如果free(p)中,p==NULL,那么无论free无论操作多少次都不会出错,如果p!=NULL,那么连续对p free 两次就会出错。
二、New/delete new[]/[]delete
new operator由两步构成,operator new 和 construct。
Delete operator 由两步构成,operator delete 和 destroy。
三、相同:
1.都可以进行动态内存分配和释放。
2.free和delete都可以释放NULL指针。?
四、不同:
1.malloc/free 是C/C++语言的标准库函数,new/delete是C++的运算符。
Operator new对应于malloc,但是operator new 可以重载,可以自定义内存分配的策略,甚至分配到非内存设备上,但是malloc不能。
2.new能够自动分配空间大小,而malloc需要计算字节数。
New内置了sizeof、类型转换和类型安全检查功能。
3.New是类型安全的,malloc不是。
Int *p=new float[2]//编译错误
Int *p=malloc(sizeof(float)*2);//编译时无法指出错误。
4.对于非内部数据类型的对象而言,对象在创建的同时需要自动执行构造函数,对象在消亡之前需要自动执行析构函数。New同时完成了对象的动态内存分配和初始化工作,delete同时完成了清理和释放内存的工作,而malloc和free不可以。
5.Malloc分配失败时,返回空指针。
Operator new分配失败时,抛出std::bad_alloc异常,但是继续提供返回0的功能。但是在使用new的入口点采用了nothrow对象。
Student *stu=new (nothrow) student;//若分配失败返回0
If(stu==0) //该检查可能会成功。
6.Malloc申请的是heap的内存空间,new申请的是free store的内存空间。
五、联系:
由于C++经常要调用C函数,所以C++还保留着malloc/free。但是必须要配套使用。