因为在c++里面新增了类,所以我们在有时候会用malloc来创建类,但是这种创建只是单纯的开辟空间,没有什么默认构造的。同时free也是free的表面,如果类里面带有指针指向堆区的成员变量就会free不干净。
所以我们c++增加了new delete和delete[]来应对类的问题。
如果还有宝子不会c语言的内存管理的,可以看这一篇->C语言内存管理
new
创建一个整形:
创建一个内容是10的整形空间:
申请十个int类型的数组:
申请十个int类型数组,并初始化:
如果是类的内存申请,会是怎么样的呢?
我们发现类每次内存申请都会调用构造函数。
我们再看:
只要我们有数据初始化,那么会调用带参构造,反之就会调用默认构造。
那我那么申请后该如何释放呢?
delete和delete[]
我们申请的单个变量用delete,数组就用delete[]:
delete和delete[]的区别
这个需要先讲他们的底层:
1、new的底层就是现malloc,然后如果是自定义类型就调用对应的析构函数。
2、delete就是调用对应的析构函数,然后用free掉
3、而delete[]不一样的就是,我们用new来申请数组的时候,如果是自定义类型的数组,那么就会额外在这个数组前面开一个内存来存储它的长度,用来看有几个变量,这样的做法主要是为了释放自定义类型(类)的。
我们看如下举例来验证:
调试后我们看到的确如此
大家不信我们可以换一下长度:
我们走完全程发现析构了六次:
如果我们直接用delete来释放数组,只会释放第一个位置的内存就会崩掉:
原因就是:我们释放内存不能只释放一块,用delete只能释放第一个数据,前后的数据还在那,或者可能把后面的内存释放完了,但是前面的存储长度的内存没有释放。
那么根据这个原理,我应该可以用delete来释放没有类的数组:
确实如此:因为delete在没有类的情况下就是一个free函数。没有类的数组前面不会有一个空间记录长度,那么从p开始就可以直接free干净。但是不建议这么写。
内存申请失败的处理方法
在C语言里面,是判断返回值是否为NULL,在c++里面就是抛异常来解决。如果有异常,可以采取相关措施释放一些不必要的堆区内存然后重新申请达到处理的目的。