malloc/free是 C 语言库函数,new/delete是C++的操作符。
new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持。
这里的new是指new的三种形态中的operator new
1. malloc 和 free 的函数原型:
void * malloc(size_t_size); //malloc 函数原型
//1.size为内存块大小,以字节为单位
//2.该函数返回值为一个指针,指向已分配大小的内存,请求失败,返回NULL。
void * free(void * ptr); //free 函数原型
2. malloc/free 和 new/delete 的使用:
动态开辟内存
//开辟动态内存
int *p =(int*)malloc(sizeof(int));//malloc 不能进行初始化
free(p);
int *p = new int(10);//new 可以进行初始化
delete p;
//开辟数组
int * p= (int *)malloc(sizeof(int)*10)//malloc开辟一维数组
free(p);
int * pp= (int **)malloc(sizeof(int*)*10)//malloc开辟二维数组
free(pp[i]);
free(pp);
int * cp = new int[10];//new开辟一维数组
delete[]cp;
int * cpp = new int*[10];//new开辟二维数组
delete[]cpp[i];
delete[]cpp;
new分配对象内存的三个步骤:
(1)调用operator new()分配内存;
(2)调用构造函数来构造对象并传入初值;
(3)返回指向该对象的指针。
delete释放对象内存的两个步骤:
(1)调用析构函数;
(2)调用operator delete释放内存。
3.malloc 和 new区别
- new是关键字 malloc是函数
- new 自由存储区域 malloc 堆
- new可以做初始化 malloc单纯开辟内存
- new可以重载 malloc不能重载( operator new调用构造,可以重载)
- new可以调用malloc malloc不能调用new
- new可以开辟常量 malloc不能
- new申请失败抛出异常,malloc申请失败返回NULL
- new返回值安全,malloc返回值是void*,半开半闭区间,不安全
- 开辟数组方式不同:new[],malloc
- new 提供内存不足处理机制,malloc不提供。
5的原因:①向前兼容,c++兼容从c的语法,所以new可以调用malloc;
②new operator可以重载,可调用malloc (operator new[](size_t size);)
如下表汇总两者区别:
相关面经
1.堆分配的地址空间是否连续?
逻辑地址是连续的,物理地址不连续。