【C++笔记】C++内存管理

一、C++中动态内存申请的方式

在C语言中我们需要动态申请空间的时候我们通常都是用malloc函数,但是malloc函数对自定义类型是没什么问题的,但是对于自定义类型就不那么适用了。
因为malloc函数负责的只是开空间,并不会去调用类的构造函数:
在这里插入图片描述
如果是像栈这样的有额外申请空间的类,没有初始化这将是一件很危险的事情,因为我们后面向栈中插入数据的时候就一定会出错(野指针)。

所以为了解决这样的问题,C++就设计了套新的动态内存申请的方案,即new和delete。

在C语言中使用malloc动态申请的空间不仅需要我们强转成指定的指针类型而且还需要我们手动计算空间的大小:
在这里插入图片描述
但在C++中使用new,我们不需要强转而且只需要给出数据的个数即可:
在这里插入图片描述
如果只是申请一个int空间,那就不用再int后面加[]:
在这里插入图片描述
并且对于自定义类型,new也会去自动调用构造函数:
在这里插入图片描述
像C语言一样,动态申请的空间默认不会去初始化:
在这里插入图片描述
但C++支持在动态申请的同时去给空间初始化:
在这里插入图片描述
而且也像C语言一样未指定初始化的数据就是用0来做默认值。

如果只是申请一个空间就是用括号:
在这里插入图片描述
这其实也就是像自定义类型一样去调用构造函数:
在这里插入图片描述
而如果是多个对象的话,我们就可以用到匿名对象或饮食类型转换:
在这里插入图片描述
而且从结果来看,如果没有指定构造的话就回去调用是用默认构造的缺省值。

说完new,我们再来说delete,对于内置类型来说new和delete与malloc和free几乎没什么区别,我们主要来说说自定义类型:
在这里插入图片描述
对于自定义类型,delete会去调用析构函数,这是free函数所欠缺的。

如果只是单个对象,我们我们就不用加[]:
在这里插入图片描述

二、new和delete的实现原理

2.1、operator new和operator delete函数

其实new和delete的底层还是使用malloc和free实现的,但他们并不能直接调用malloc和free。因为使用new如果空间申请失败的话是要抛异常的,并且delete要去调用析构函数。
而malloc如果空间申请失败的话就直接返回0了(空指针),free也只是单纯的释放空间并不会去调用析构函数。
所以C++需要对malloc和free进行“封装”,封装成两个函数:operator new和operator delete。

我们现在来看看库中的operator new和operator delete的实现:
在这里插入图片描述
在这里插入图片描述
我们会发现其实里面还是用到了malloc和free的,至于其他的那些看不懂的都是跟异常现相关的。我们现在可以不理会。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

林先生-1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值