在C语言中,我们用的 malloc/calloc/realloc 来开辟空间
我们可以发现,用上面这三种方式开辟空间总是需要强转,并且还要根据类型来计算需要开多少字节的空间,用起来不算很方便。
使用new,开空间就会很方便,可以自动计算大小,不需要强转。
int* p4 = new int[10];
这两种开辟空间的方法,对于内置类型来讲都不会初始化。
用new开辟的空间,初始化也可以很简单,在后面加上{}即可,{}里面的内容就是你想要初始化的值,用“,”隔开
我们可以看到,{} 内填几个值,就会将几个值初始化为你填的内容,后续的值会被初始化成0。
对于自定义类型使用new会自动调用成员的构造函数。如下,a1已经被初始化了。
但是如果你使用malloc,会发现没有办法去调用构造函数,因为构造函数是C++的内容,C语言的malloc不认识构造函数,你想显示调用也不行,因为构造函数是在类对象初始化的时候自动调用了,这是祖师爷创造new的根本所在。
delete是配合new来一起使用的,new 出来的自定义类型会调用构造函数,delete 的自定义类型会调用析构函数。
使用方法也很简单,用法为 delete +指针变量
对于开辟出来的数组,用法为 delete[] + 指针变量
上面使用的是默认构造,对于非默认构造,依然可以用 {} 来进行初始化 ,
这里采用了隐式类型转化。
malloc开辟内存失败会返回一个空指针,
new开辟内存失败会抛异常,需要用try catch去捕获这个异常,这里我们暂作了解。
malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。
不同的地 方是:
1. malloc和free是函数,new和delete是操作符
2. malloc申请的空间不会初始化,new可以初始化
3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可, 如果是多个对象,[]中指定对象个数即可
4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型
5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需 要捕获异常
6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new 在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理