C++内存管理(new和delete)

一、new 和 delete

1.内置类型

在C语言中,我们用的 malloc/calloc/realloc 来开辟空间

C++内存管理(new和delete)_第1张图片

我们可以发现,用上面这三种方式开辟空间总是需要强转,并且还要根据类型来计算需要开多少字节的空间,用起来不算很方便。

 使用new,开空间就会很方便,可以自动计算大小,不需要强转。

int* p4 = new int[10];

这两种开辟空间的方法,对于内置类型来讲都不会初始化。 

用new开辟的空间,初始化也可以很简单,在后面加上{}即可,{}里面的内容就是你想要初始化的值,用“,”隔开

 C++内存管理(new和delete)_第2张图片

我们可以看到,{} 内填几个值,就会将几个值初始化为你填的内容,后续的值会被初始化成0。 

2.自定义类型

对于自定义类型使用new会自动调用成员的构造函数。如下,a1已经被初始化了。

C++内存管理(new和delete)_第3张图片

但是如果你使用malloc,会发现没有办法去调用构造函数,因为构造函数是C++的内容,C语言的malloc不认识构造函数,你想显示调用也不行,因为函数是在类对象初始化的时候自动调用了,这是祖师爷创造new的根本所在。

delete是配合new来一起使用的,new 出来的自定义类型会调用构造函数,delete 的自定义类型会调用析构函数。

使用方法也很简单,用法为  delete +指针变量  

C++内存管理(new和delete)_第4张图片

对于开辟出来的数组,用法为 delete[]  + 指针变量

C++内存管理(new和delete)_第5张图片

上面使用的是默认构造,对于非默认构造,依然可以用  {}  来进行初始化 ,

这里采用了隐式类型转化。

C++内存管理(new和delete)_第6张图片

二.malloc、new失败的区别 

malloc开辟内存失败会返回一个空指针,

C++内存管理(new和delete)_第7张图片

new开辟内存失败会抛异常,需要用try catch去捕获这个异常,这里我们暂作了解。

C++内存管理(new和delete)_第8张图片

三、总结

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在释放空间前会调用析构函数完成空间中资源的清理 

你可能感兴趣的:(c++,开发语言)