C++内存管理

在C语言中我们想要一块内存我们需要怎么做呢??

我们可以直接malloc一块内存,那么在C++中我们先要一块空间需要怎么做呢??

new和delete

 new是C++中的一个操作符,首先它和malloc的区别就是malloc是函数,那么我们看一下他们的区别,以及看一下new的使用

我们的new就是后面直接跟类型就可以了,并且不需要我们自己去算需要开辟的大小

那么他们的释放有什么区别吗??

 对于malloc来说释放最好使用free,而new出来的空间我们最好使用delete来释放这块空间,我们也最好不要交叉使用

那么我们继续看一下他们的区别

我们想一下,我们的malloc的空间可以初始化吗??

 

我们的new后面的类型后面带括号可以初始化,我们看到确实把我们的p4指向的空间初始化为了1

那么我们想要开辟一段数组呢??

 如果是malloc的话就是直接计算出想要开辟的空间大小,然后直接开辟,但是malloc看起来是更方便一点的,就像数组一样,使用起来更简单一点 

那么我们想要初始化new出来的这一段空间呢??

我们看到这样是不可以的,那么我们应该怎么做呢? 其实这里和C语言的数组初始化还是比较相似的,我们往下面看

 

这样就好了,确实和数组有点像 

那么我们值给一个值呢?

 

我们看到只给了一个值剩下的就用0初始化了

那么new1出来的数组还是使用delete释放吗??

 

我们这样 释放可以吗??不可以!

对于new的数组而言我们的正确释放应该是这样的

那么如果我们free和delete在这里混用呢?

 

其实delete和free混用不管在那里都是很危险的,不同的环境结果不同,有一些混用会直接报错,但是我这里并没有

那么new和malloc只有这么一点区别吗?

如果我们对内置类型动态申请内存呢?

 

我们现在有一个A类,那么我们对A进行动态内存申请呢??

 我们看有什么区别?

 

我们看到new调用了A的构造函数,所以我们的new在进行开辟空间后还会调用构造函数

那么 delete和free有什么区别吗?

 

我们delete调用了析构函数

malloc和free: 只是单纯的开辟空间和释放空间

new和delete: new在new自定义类型时开辟空间后会调用对于类的构造函数,而delete会调用类的析构函数,然后释放对应空间

我们new在这里调用构造函数,所以我们在这里还可以给初始值

 

 

下面我们在看一下对于数组有什么区别

 

我们看到调用了5次构造,释放的时候有调用了5次析构,所以new和delete在new数组和delete数组的时候时一个一个构造和析构的

 operator new 和 operator delete

我们知道我们的new是 开辟空间 + 调用构造函数

delete 是 调用析构函数 + 释放空间

而我们还是知道C++是由C语言转换过来的,那么我们既然有现成的开辟空间的函数我们会不会用呢?? 当然会使用

但是我们的C++是面向对象的,而C语言是面向过程的,如果我们在C语言中malloc失败我们会怎么做,返回空指针,但是在面向对象里面我们的new出错我们需要抛异常,所以我们还需要一个可以在开辟空间失败后抛异常的函数,所以就有了我们的operator new 和operator delete

我们来看一下

我们 先来看一下他们的使用

我们的operator new的使用和malloc的使用一摸一样,我们看一下会不会调用构造

也证明我们刚才说的确实如此,那么我们的operator delete怎么使用呢?? 会不会调用析构

我们的operator delete使用方法和free使用也是一样的,同样不会抛异常

 

但是我们的opeartor new/delete其实是太轻易为我们的new和delete准备的,而operator new/delete又是使用了malloc和free,但是多加了面向对象的抛异常

我们来看一下反汇编

我们 这里确实call了operator new

我们看到delete的时候我们还是先调用了,对应类的析构,然后call了operator delete

下面我们看一下他们的区别

总结:

1.new/delete是操作符,而malloc/free是函数

2.new后得到的值不需要类型强转,而malloc会返回void*的指针,需要强转

3.new/delete操作比较简单,而malloc/free稍微较复杂

4.new和delete出错了会抛异常,而malloc和free是返回错误码

5.new可以初始化,而malloc不行

6.new和delete对自定义类型会分别调用对应的构造函数和析构函数,而malloc和free只能开辟空间和释放空间

如果上面有不完善的欢迎各位指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naxx Crazy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值