new/delete 是C++中专门管理堆内存的语句,而malloc/free是C语言中的标准库中的函数。
new与malloc作用相同,都是分配堆内存。
delete与free 释放堆内存。
new在分配内存是允许初始化
int* p = new int(val);
new/delete 与 malloc/free 不能混用
int* p = new int;
free(p);//虽然语法允许,但是最好不要这样使用
使用new分配内存时会自动调用类型的构造函数,而delete会自动调用析构函数,但是malloc/free做不到。
数组的分配和释放 new 类型[个数] 分配一块连续的多个类型相同的内存,相当于calloc相当于堆内存中分配了一个数组,并且会自动调用多次构造函数。
delete[] 专门用于释放new[] 所申请的内存,并且会自动调用多次析构函数
注意:new/delete malloc/free new[]/delete[] 不能混用
使用new[]为结构、联合、类申请到的内存的前面4个字节记录了申请的次数,这样可以让编译器应该调用多少次构造、析构函数
重复释放:delete可以释放空指针,别的不能重复释放,这一点与free一致
内存分配失败:malloc分配失败返回NULL
new 分配会抛出一个异常 std::bad_alloc
new/malloc 的返回:
new 返回一个有类型的指针。malloc 返回一个void* 类型的指针。
以下表为总结
malloc/free | new/delete |
---|---|
函数 | 运算符/关键字 |
返回值(void*) | 带类型的指针 |
字符个数 | 类型(自动计算) |
失败返回NULL | 失败返回 std::bad_alloc |
不能调用构造/析构 | 自动调用构造析构 |
不能初始化 | 可以初始化为指定的值 |
包含头文件 | 直接使用 |