一、malloc与free回顾
C语言中的malloc与free:malloc与free称做C的库函数。
malloc与free开辟内存:
int *p = (int*)malloc(sizeof(int));
if (p == nullptr)
{
return -1;
}
*p = 20;
free(p);
malloc: 内存开辟失败是用返回值与空指针进行判断的,malloc是按照字节开辟内存的,返回值为void * ,需要对其强转。只管开辟内存,不管初始化,我们需要单独对其初始化。
free: 进行释放内存。
malloc与free开辟数组内存:
int *q = (int*)malloc(sizeof(int)*20);
if (q == nullptr)
{
return -1;
}
free(q);
二、new与delete简单使用
C++中的new与delete:new与delete称作运算符。
注意点:
1.new不仅可以开辟内存,还可以进行内存初始化。
2.malloc开辟内存失败,是通过返回值和nulptr做比较,而new开辟内存失败,是通过抛出bad_alloc类型的异常来判断的。
new与delete开辟内存:
int *p1 = new int(20);
delete p1;
new: 在堆上指定开辟一个整型类型,并用小括号进行初始化,因此不再需要类型转换。通过抛出bad_alloc类型的异常来判断开辟内存失败。
delete: 释放内存。
new与delete开辟数组内存:
int *q1 = new int[20]();//开辟20个整型,每一个初始化为0
delete[]q1;
三、new与delete、delete与free对比
new和maloc区别:
1.malloc与free本身为C的库函数;new与delete在C++中为运算符。
2.malloc开辟内存若失败,通过空指针来比较,并且malloc只负责开辟内存,不负责初始化;new不仅可以开辟内存,还可以进行初始化。
3.new在开辟时指定类型,不需要进行强转;而malloc只是开辟内存,不管内存中放什么数据,返回的市void * 需要对返回值强转。
delete和free区别:
1.free不管释放单个元素内存还是数组内存,只需要传入内存的起始地址即可;
delete释放单个元素内存,不需要加中括号,但释放数据内存时需要加中括号。
new有多少种?
情况1:最常用操作,抛异常处理内存开辟失败
int *p1 = new int(20);//最常用操作,通过抛出异常判断内存开辟失败
情况2:不抛出异常
int *p2 = new (nothrow) int;//不抛出异常,开辟失败判断情况与malloc一样
情况3:堆上开辟常量
const int *p3 = new const int(40);//在堆上开辟了一个常量
情况4:定位new
//定位new
int data = 0;
int *p4 = new (&data) int(50);//在指定的内存上划分了一块初值为4字节大小的内存,初值为50