【C++】内存管理的基本操作,new与delete的实现原理以及operator new与operator delete函数

news/2024/11/17 9:47:35/

文章目录

  • 前言
  • 一、new,delete操作内置类型
  • 二、new/delete操纵自定义类型
  • 3. operator new与operator delete函数
  • 4. new/delete实现原理
  • 4.malloc/free和new/delete的区别


前言

程序中内存的划分:
在这里插入图片描述

  1. 栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的。
  2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。
  3. 堆用于程序运行时动态内存分配,堆是可以上增长的。
  4. 数据段–存储全局数据和静态数据。
  5. 代码段–可执行的代码/只读常量。

一、new,delete操作内置类型

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[],注意:匹配起来使用。

二、new/delete操纵自定义类型

在这里插入图片描述

在这里插入图片描述

3. operator new与operator delete函数

new和delete是用户进行动态内存申请和释放的操作符operator newoperator delete是系统提供的全局函数new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

operator new: 该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败,尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。
operator delete: 该函数最终是通过free来释放空间的

4. new/delete实现原理

new的原理

  1. 调用operator new函数申请空间
  2. 在申请的空间上执行构造函数,完成对象的构造

delete的原理

  1. 在空间上执行析构函数,完成对象中资源的清理工作
  2. 调用operator delete函数释放对象的空间

new T[N]的原理

  1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对 象空间的申请
  2. 在申请的空间上执行N次构造函数

delete[]的原理

  1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
  2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释 放空间

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.malloc/free和new/delete的区别

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

http://www.ppmy.cn/news/247158.html

相关文章

echarts 图表导出PDF(带滚动条)/图片导出PDF

echarts 图表导出PDF[带滚动条]/图片导出PDF 效果展示提出问题思考问题解决问题导出PDF 里面的页头中文乱码问题参数说明 效果展示 提出问题 在开发过程中,有需求是将展示出来的echarts图表导出为pdf 原本我的滚动条是使用echarts图表进行的滚动,但通过了解后得知,echarts图表如…

vite+vue3+ts+eslint+prettier+husky+lint-stated 项目搭建

项目搭建 创建初始项目 Node.js 版本 14.18,16 npm create vitelatest my-vue-app --template vue-ts 添加eslint eslint 初始化 npm init eslint/config eslint初始化脚本,按自己的要求选择相应的eslint 配置,以下是我选择的配置项 ✔ H…

软件测试人员迷茫之中如何找到职业发展的方向?

出现迷茫或焦虑的原因是什么? 也许每个人的原因不一样,但不外乎是下面这些原因叠加的结果。 1、敏捷和DevOps开发模式的推行,虽然20年的历史是否已经证明“敏捷已经失败了” 暂且不管,但敏捷/DevOps之风刮的还是很厉害&#xff0c…

Advanced features

在处理特征时不仅可以单独地处理每个特征,还可以将它们联合起来处理,如下面的数据中,后面三个生成的特征,是根据user_id和page_id分组聚合生成的最大价格,最小价格,最小价格坐在网页位置, 除…

pm模式 raid_Adaptec RAID PM8060 用户手册.pdf

Adaptec RAID PM8060 用户手册 PM8060 RAID 用户手册 尊敬的浪潮英信服务器用户: 衷心感谢您选用浪潮英信服务器! 本手册将为您简单介绍一下PM8060 RAID 的特色功能 和常操作下的安装使用方法。 浪潮集团有限公司拥有本手册的版权。未经浪潮集团有限公司许可,任何单位和个人…

常见Adapter

本文来自 柠檬的博客 http://blog.sina.com.cn/demonzym 从google的demo开始,第一个NoteList开始就出现了Adapter、List,而观察常见的一些android应用,跟adapter相关的界面也经常出现,所以觉得,不好好学习一下&#…

Adapter接口

public interface Adapter android.widget.Adapter是用于绑定Data和AdapterView 的适配器 实现它的直接接口类有: ListAdapter SpinnerAdapter Adapter定义了很多接口: Public Methods abstract int getCount() How many items are in the data…

2023 WWW Adap-: Adaptively Modulating Embedding Magnitude for Recommendation

目录 1 摘要 2 研究背景 2.1 损失函数 2.2 表征模长 3 表征模长理论分析 3.1 理论分析</