当前位置: 首页 > news >正文

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

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

  • 一、C++中动态内存申请的方式
  • 二、new和delete的实现原理
    • 2.1、operator new和operator delete函数

一、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的,至于其他的那些看不懂的都是跟异常现相关的。我们现在可以不理会。

http://www.lryc.cn/news/145063.html

相关文章:

  • 十四五双碳双控时代下的“低碳认证”
  • Android——基本控件(下)(十九)
  • 聚类分析 | MATLAB实现基于DBSCAD密度聚类算法可视化
  • reactantd(12)动态表单的默认值问题
  • 无涯教程-Python机器学习 - Stochastic Gradient Boosting函数
  • SOLIDWORKS中多实体文件到装配体的转换技巧
  • Transformer (Attention Is All You Need) 论文精读笔记
  • Git企业开发控制理论和实操-从入门到深入(二)|Git的基本操作
  • Positive Technologies 专家帮助修复 Western Digital 网络存储设备中的一个危险漏洞
  • 【springboot】springboot定时任务:
  • 腾讯云学生服务器申请、学生认证入口及学生机价格表
  • pip安装mysqlclient依赖报错 /bin/sh: 1: mysql_config: not found如何解决
  • 基于paddleocr的版面分析
  • 网工内推 | IT网工,华为、华三认证优先,15k*13薪
  • leetcode 739. 每日温度
  • 【活体检测模型】活体检测思路推演
  • 【微服务部署】03-健康检查
  • SQL注入之报错注入
  • 基于大数据+django+mysql的银行信用卡用户的数仓系统
  • 【网络】多路转接——五种IO模型 | select
  • sql顺序倒序查询
  • java和sql生成时间维度数据
  • HUT23级训练赛
  • sm4 加解密算法工具类( Java 版 )
  • Redis项目实战——商户查询缓存
  • 重磅OpenAI发布ChatGPT企业版本
  • # Go学习-Day7
  • uniapp-form表单
  • 漏洞挖掘-利用
  • React钩子函数之useDeferredValue的基本使用