C/C++的内存管理(2)——new与delete的内核与本质

news2025/1/20 1:54:36

内存管理

  • operator new 与 operator delete函数
  • 回看new与delete的实现
    • 内置类型
    • 自定义类型
  • 常见面试题

我们已经知道了new与delete的用法及其好处,发现它似乎与C语言中的动态内存开辟的函数(malloc/calloc/realloc)不同
在这里我们特别指出: new与delete的本质是操作符并不是函数!!
下面我们一一具体来看看new与delete到底是什么?

operator new 与 operator delete函数

operator new与operator delete是C++中提供的全局函数;
new的底层通过调用operator new函数来进行申请空间
我们不妨来分别看看new底层汇编码:在这里插入图片描述
确实new的底层会调用operator new函数,其中new[]会调用operator new[](本质上最后还会去调用operator new),那同学们会好奇operator new的底层又是什么呢?不妨继续看看operator new的反汇编:在这里插入图片描述
我们发现operator new会调用malloc,至此我们绕了个大圈发现new本质上就是malloc,我们之所以要用operator进行封装就是因为malloc无法抛异常,operator new将抛异常的操作封装了起来。
实质上new的底层如下图:
在这里插入图片描述
那delete的底层和new类似,通过operator delete函数来进行空间的释放,需要注意的点是delete会先调用析构函数然后再调用operator delete以防止内存泄漏问题。在这里插入图片描述

回看new与delete的实现

内置类型

对于内置类型,new与delete的功能与malloc/free的功能基本一致,new与delete表示开辟与是放单个空间;new[]表示申请的是连续的一段空间,因此对于内置类型释放空间时采用delete与delete[]的效果一样都是释放一整段空间(因为空间属于连续开辟的)
在这里插入图片描述

自定义类型

对于自定义类型由于需要调用构造函数与析构函数,因此new与new[]、delete与delete[]会有更大的区别,new[]会在必要时在头部多开辟四个字节的空间以存储[]内的值,具体如下:

new的原理

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

delete原理

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

newT[]原理

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

delete[]原理

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

对于自定义类型(尤其是有析构函数的自定义类型)不能用new[]开辟空间,然后用delete来释放空间:在这里插入图片描述
这是因为若自定义类型有析构函数,那delete只调用一次析构函数释放单独的一块空间,而申请的空间是连续的一整块空间,不能单独释放其中的一部分(和malloc类似)。在这里插入图片描述
因此开辟与释放空间尽量配套使用!!!,不匹配结果不确定。

常见面试题

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.coloradmin.cn/o/1469870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EasyRecovery2024电脑版软件评测与使用教程

一、EasyRecovery电脑版软件评测 EasyRecovery电脑版是一款功能强大、操作简便的数据恢复软件。它适用于多种场景,无论是误删除、格式化、分区丢失还是硬件故障,都能提供有效的恢复方案。该软件界面直观,即便没有技术背景的用户也能轻松完成…

C语言第三十弹---自定义类型:结构体(上)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 结构体 1、结构体类型的声明 1.1、结构体回顾 1.1.1、结构的声明 1.1.2、结构体变量的创建和初始化 1.2、结构的特殊声明 1.3、结构的自引用 2、结构体内存…

就业攻略:ChatGPT为您解析职场秘诀!【文章底部添加可得内推码汇总表】

目录 优化个人简历和求职信 提供面试准备和技巧 提供职业规划和发展建议 提供职场生存技巧和建议 作为一种强大的自然语言处理工具 在当今竞争激烈的就业市场中,成功找到理想的工作并不容易。职场新人常常感到困惑,不知道如何才能在众多竞争者中脱颖…

机器学习基础(六)TensorFlow与PyTorch

导语:上一节我们详细探索了监督与非监督学习的结合使用。,详情可见: 机器学习基础(五)监督与非监督学习的结合-CSDN博客文章浏览阅读4次。将监督学习和非监督学习结合起来,就像将两种不同的艺术形式融合&a…

OpenAI 全新发布文生视频模型 Sora,功能有多强大?

卷疯了卷疯了,短短十几小时内,OpenAI和谷歌接连发布核弹级成果。 国内还没睡的人们,经历了过山车般的疯狂一晚。 就在刚刚,OpenAI突然发布首款文生视频模型——Sora。简单来说就是,AI视频要变天了! PS&a…

《高效使用Redis》- 由面试题“Redis是否为单线程”引发的思考

由面试题“Redis是否为单线程”引发的思考 很多人都遇到过这么一道面试题:Redis是单线程还是多线程?这个问题既简单又复杂。说他简单是因为大多数人都知道Redis是单线程,说复杂是因为这个答案其实并不准确。 难道Redis不是单线程&#xff1f…

Linux进程【补充】

文章目录 进程概念task_struct 进程创建forkvfork写时拷贝 进程状态僵尸进程孤儿进程守护进程 进程地址空间是什么为什么怎么做 进程概念 进程是一个程序的执行实例或者是担当系统资源分配的实体。当一个程序运行时,被从硬盘加载到内存中,操作系统为每个…

你真的了解@Async吗?

你真的了解Async吗? 使用场景: 开发中会碰到一些耗时较长或者不需要立即得到执行结果的逻辑,比如消息推送、商品同步等都可以使用异步方法,这时我们可以用到Async。但是直接使用 Async 会有风险,当我们没有指定线程池…

政安晨【示例演绎虚拟世界开发】(一):Cocos Creator 的 Hello World

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: AI虚拟世界大讲堂 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正。 前言 Cocos Creator是一款非常强大的游戏开发引擎,它有着优秀…

李宏毅2023机器学习作业1--homework1——python语法

# 定义list del_col del_col [0, 38, 39, 46, 51, 56, 57, 64, 69, 74, 75, 82, 87] # 删除raw_x_train中del_col的列,axis为1代表删除列 raw_x_train np.delete(raw_x_train, del_col, axis1) # numpy数组增删查改方法 # 定义列表get_col get_col [35, 36, 37,…

sql语法中所有的条件字段都可以用函数来加工

SELECTt_test.age FROMt_testINNER JOIN t_test_copy1 ON SUBSTR( t_test.age, 1, 4 ) t_test_copy1.idd

加速Python代码的秘密武器,探索Cython的秘密

首先和大家明确一下这个Cython单词的读法,这个单词Cython以前我也不知道怎么读,老后面要用到这个包的时候,老是不清楚读法,才去搜了下,这个单词是读"赛森",就是前面的cy是读"赛"&#…

C语言每日一题(61)盛最多水的容器

题目链接 力扣 11 盛最多水的容器 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水…

IDEA安装配置以及安装配置Maven

IEDA官方下载地址,有专业版(收费,破解),社区版(免费) 下载 IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 安装配置Maven 1.解压apache-maven-3.6.3-bin.zip,安装maven到D盘softwar…

高校隔离宿舍管理系统

高校隔离宿舍管理系统 获取源码——》公主号:计算机专业毕设大全

堆排序、快速排序和归并排序

堆排序、快速排序和归并排序是所有排序中最重要的三个排序,也是难度最大的三个排序;所以本文单独拿这三个排序来讲解 目录 一、堆排序 1.建堆 2.堆排序 二、快速排序 1.思想解析 2.Hoare版找基准 3.挖坑法找基准 4.快速排序的优化 5.快速排序非…

Java中PDF文件传输有哪些方法?

专栏集锦,大佬们可以收藏以备不时之需: Spring Cloud 专栏:http://t.csdnimg.cn/WDmJ9 Python 专栏:http://t.csdnimg.cn/hMwPR Redis 专栏:http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏:http://t.csdni…

Type-C连接器笔记

一、Type-C的介绍 Type-C是一种全新的USB接口形式,由USB Implementers Forum(USB-IF)制定,并在2014年获得苹果、谷歌、英特尔、微软等厂商支持后开始普及。它是一种通用串行总线(USB)的硬件接口规范&#x…

python学习26

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…

软考37-上午题-【数据库】-数据模型、数据库的三级模式和二级映像

一、考情简介 上午题:6分——6道选择题 下午题:15分——一道分析题 E-R图、关系模式:下午考试必考!!!(编制也要考!) 二、数据模型 数据模型是对现实世界数据特征的抽象…