一. 执行内容:
malloc / free:
malloc 函数的参数接收所需分配的内存字节数,如果内存满足请求量,将返回指向被分配内存起始地址的指针;
free 释放指针所指向的内存,其中指针必须指向所释放内存空间的首地址;
new / delete:
new 分为两步:1).通过operator new 分配内存 2).为被分配的内存调用一个或多个构造函数构建对象;
delete 也分两步: 1).为将被释放的内存调用一个或多个析构函数 2).通过operator delete 释放内存;
二. 本质区别:
1.malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符;
2.对于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++需要一个能对对象完成动态内存分配和初始化工作的运算符new,以及一个能对对象完成清理与释放内存工作的运算符delete---简而言之 new/delete能进行对对象进行构造和析构函数的调用进而对内存进行更加详细的工作,而malloc/free不能。
三. 两者联系:
既然new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete,malloc/free必须配对使用。
四. 使用要点:
int *p1 = (int *)malloc(sizeof(int) * length); free(p1); int *p2 = new int[length]; delete [] p2;
1.malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数;
2.malloc 返回值的类型是void *,所以在调用malloc 时要显式地进行类型转换,将void * 转换成所需要的指针类型;
3.运算符new 使用起来要比函数malloc 要更简单在于能动态分配内存,new 内置了sizeof、类型转换和类型安全检查功能;对于非内部数据类型的对象而言,new 在创建动态对象的同时完成了初始化工作;如果对象有多个构造函数,那么new 的语句也可以有多种形式。
4.如果用new 创建对象数组,那么只能使用对象的无参数构造函数;
Obj *objects = new Obj[100]; // RIGHT
Obj *objects = new Obj[100](1); // WRONG