【C++杂货铺】内管管理


目录

🌈前言🌈

📁 C/C++中内存分布

📁 new 和 delete的使用

📁 new 和 delete的优点

📁 new 和 delete的原理

 📂 operator new 和 operator delete函数

 📂 内置类型

 📂 自定义类型

📁 内存泄漏

📁 总结


🌈前言🌈

        欢迎收看本期【C++杂货铺】,本期内容讲解C++内存管理。包含了C++中内存分布情况,如何进行内存管理,使用new和delete操作符开辟/释放空间等,此外将介绍C++中new 和 delete的优点和原理。

        此外,本期内容可能会涉及到类和对象的部分概念,如果你还不是很了解,可以快速阅览以下文章:

【C++杂货铺】详解类和对象 [上]-CSDN博客

【C++杂货铺】详解类和对象 [中]-CSDN博客

【C++杂货铺】详解类和对象 [下]-CSDN博客

📁 C/C++中内存分布

        程序运行会被加载到内存,程序的代码和数据则会在内存中存储在不同地方,通过内存地址进行访问。

        内存地址是计算机中用来标识存储单元位置的一个唯一的数字。在计算机中,每个存储单元都有一个唯一的地址,通过这些地址可以访问和操作存储器中的数据。内存地址通常用十六进制表示。

        为了方便管理不同的类型的数据,如全局变量和局部变量,就会在内存中划分出不同区域。

当然这只是简单的了解一下内存分布,如果你学过操作系统的内容,你就会知道,C/C++中的内存概念其实都是虚拟内存,不是真实的物理内存。

        上图中,不同书籍可能会有偏差,如果只学过语言,只需要知道有栈,堆,数据段,代码段即可。其中栈存放局部变量,形参等数据,堆则是由程序员自己手动开辟,存放数据。

        所以,堆区则是我们进行内存管理的区域了。

📁 new 和 delete的使用

        学过C语言可能知道,想要在C语言中开辟内存空间需要使用malloc函数,释放资源使用free函数。

        下图是malloc和free函数的使用示例。

开辟1个int类型数据的空间
int* pa = (int*)malloc(sizeof(int));
if(pa == NULL )return 1;free(pa);开辟10个int类型数据的空间
int* parr = (int*)malloc(sizeof(int) * 10 );释放连续地址空间只需要给出首元素地址即可
free(parr);

        我们可以看出使用malloc函数非常的不方便,例如只开辟空间,不能完成初始化;需要手动判断内存是否开辟成功。

        此外,最重要的是,对于自定义类型,是需要构造函数初始化,但是malloc开完空间后,不能调用构造函数。

        所以C++语言就引入了两个操作符new 和 delete。

        下图是new 和 delete操作符的使用示例。

int* pa = new int;
delete pa;int* parr = new int[10];
delete[] parr;
        申请和释放单个元素的空间,使用 new delete 操作符,申请和释放连续的空间,使用 new[] delete[] ,注意:匹配起来使用

📁 new 和 delete的优点

        上文中,我们已经知道了new 和 delete 操作符的部分优点:

1. 编译器会自动检查内存空间是否成功开辟,如果失败,则会抛异常。

2. 可以完成初始化的工作。对于自定义类型,会调用它的构造函数和析构函数。

int* pa = new int(1);//如果是不完全初始化,后面会用0代替。
int* parr = new int(10){1,2,3,4,5};

📁 new 和 delete的原理

        以上我们简单了解了new和delete操作符的基本使用,想要彻底掌握,我们就从底层了解new和delete的区别以及底层实现。

 📂 operator new 和 operator delete函数

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

/*
operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间
失败,尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。
*/
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{
// try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)if (_callnewh(size) == 0){// report no memory// 如果申请内存失败了,这里会抛出bad_alloc 类型异常static const std::bad_alloc nomem;_RAISE(nomem);}
return (p);
}
/*
operator delete: 该函数最终是通过free来释放空间的
*/
void operator delete(void *pUserData)
{_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));if (pUserData == NULL)return;_mlock(_HEAP_LOCK);  /* block other threads */__TRY/* get a pointer to memory block header */pHead = pHdr(pUserData);/* verify block type */_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));_free_dbg( pUserData, pHead->nBlockUse );__FINALLY_munlock(_HEAP_LOCK);  /* release other threads */__END_TRY_FINALLYreturn;
}
/*
free的实现
*/
#define   free(p)               _free_dbg(p, _NORMAL_BLOCK)

        通过两个全局函数的实现就知道了,operator new 实际通过malloc来申请空间,如果malloc申请成功直接返回(原地扩容),否则执行用户提供的空间不足的措施(异地扩容),如果用户提供改措施,则会继续申请,否则抛异常。

         operator delete 最终通过free来释放空间。

 📂 内置类型

        如果申请的是内置类型的空间(int , double,指针...),new和malloc ,delete和free基本类似,不同之处在于:new 和 delete 是申请和释放单个元素空间,new[]和delete[]申请的是连续空间,释放连续的空间。而且new申请空间时会抛异常,malloc则会返回NULL。

 📂 自定义类型

        ● new的原理

        1. 调用operator new函数申请空间。

        2. 在申请的空间上执行构造函数,完成对象的构造。

        ● delete的原理

        1. 在空间上进行析构函数,完成对象资源的清理工作。

        2. 调用operator delete函数释放对象空间。

        ● new[ ]的原理 

        1. 调用operator new[ ]函数,在operator new[ ]中实际调用operator new函数完成 N个对象空间的申请。

        2. 在申请空间上调用N次构造函数。

        ● delete[ ]的原理

        1. 在释放对象的空间上进行N次析构函数,完成N个对象中资源的清理。

        2. 调用operator delete[ ]释放资源,实际在operator delete[ ]中调用operator delete[ ]了释放空间。

📁 内存泄漏

        什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
        内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。

        

📁 总结

        以上,就是本期【C++杂货铺】内存管理的主要内容了,主要介绍了new和delete操作符的使用,有点及其底层原理。

        此外,简单介绍了C/C++中内存分布情况,以及内存泄露的基本概念和危害。

        如果感觉本期内容对你有帮助,欢迎点赞,收藏,关注Thanks♪(・ω・)ノ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/779024.shtml

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

相关文章

Java中读取html文件转成String,展示在浏览器

这里写目录标题 第一章1.1&#xff09;pom中引入依赖和html文件示例1.2&#xff09;使用hutool工具包读取html文件转为string1.3&#xff09;页面显示 第一章 1.1&#xff09;pom中引入依赖和html文件示例 引入hutool工具包依赖 <dependency><groupId>cn.hutool&…

【C++程序员的自我修炼】基础语法篇(一)

心中若有桃花源 何处不是水云间 目录 命名空间 &#x1f49e;命名空间的定义 &#x1f49e; 命名空间的使用 输入输出流 缺省参数 函数的引用 引用的定义&#x1f49e; 引用的表示&#x1f49e; 引用的特性&#x1f49e; 常量引用&#x1f49e; 引用的使用场景 做参数 做返回值…

Docker进阶:Docker Swarm(集群搭建) —实现容器编排的利器

Docker进阶&#xff1a;Docker Swarm&#xff08;集群搭建&#xff09; —实现容器编排的利器 1、什么是Docker Swarm&#xff1f;2、Docker Swarm 与 Docker Compose的区别3、创建一个Swarm集群&#xff08;1-Manager&#xff0c;2-Worker&#xff09;1、资源准备2、初始化Swa…

使用Windows编辑工具直接编辑Linux上的代码

windows直接编辑Linux上代码 步骤如下&#xff1a; 1、按照samba 2、vim /etc/samba/smb.conf 3、输入以下内容 4 、重启下samba 输入以下内容 pkill smbd smbd 查看采用 ps -ef|grep smbd 给予文件权限&#xff1a; chmod 777 /code 5、winr 修改全选才能进入并且编写。…

快速上手Spring Cloud 六:容器化与微服务化

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

vue3+ts白屏问题解决

文章目录 打开白屏解决方法可能出现问题使用base导致的使用baseUrl导致的 注意点vue3ts白屏问题知识分享 打开白屏 解决方法 在vue.config.js页面 添加publicPath:./, const { defineConfig } require(vue/cli-service)module.exports defineConfig({ transpileDependenci…

AcWing 4609:火柴棍数字 ← 贪心算法

【题目来源】 https://www.acwing.com/problem/content/4612/【题目描述】 给定 n 个火柴棍&#xff0c;你可以用它们摆出数字 0∼9。 摆出每个数字所需要的具体火柴棍数量如下图所示&#xff1a; 请你用这些火柴棍摆成若干个数字&#xff0c;并把这些数字排成一排组成一个整数…

Git版本管理使用手册 - 8 - 合并分支、解决冲突

合并整个开发分支 切换到本地test分支&#xff0c;选择右下角远程开发分支&#xff0c;选择Merge into Current。然后提交到远程test仓库。 合并某次提交的代码 当前工作区切换成test分支&#xff0c;选择远程仓库中的dev开发分支&#xff0c;选择需要合并的提交版本右击&a…

SQL Server 实验二:数据库视图的创建和使用

目录 第一关 相关知识 什么是表 操作数据表 创建数据表 插入数据 修改表结构 删除数据表 编程要求 第一关实验代码&#xff1a; 第二关 相关知识 视图是什么 视图的优缺点 视图的优点 视图的缺点 操作视图 创建视图 通过视图向基本表中插入数据 通过视图修改基本表的…

由浅到深认识Java语言(37):I/O流

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

win10配置CLion2022+ubuntu20.04远程部署

背景 在博文ubunut搭建aarch64 cuda交叉编译环境记录中&#xff0c;使用的ubuntu20.04虚拟机安装eclipse来交叉编译aarch64的程序&#xff0c;然后发送到jetson板子上执行。开发一段时间后发现eclipse IDE使用起来不太便捷&#xff0c;因此&#xff0c;考虑使用CLion IDE&…

【数字孪生平台】使用 Three.js 以 3D 形式可视化日本新宿站地图

在本文中&#xff0c;我们将使用日本新宿站的室内地图数据&#xff0c;并使用 Three.js 将其进行 3D 可视化。更多精彩内容尽在数字孪生平台。 使用的数据 这次&#xff0c;我们将使用日本空间信息中心发布的“新宿站室内地图开放数据”的集成版本&#xff08;ShapeFile&#…

网络安全新视角:数据可视化的力量

在当今数字化时代&#xff0c;网络安全已成为各大企业乃至国家安全的重要组成部分。随着网络攻击的日益复杂和隐蔽&#xff0c;传统的网络安全防护措施已难以满足需求&#xff0c;急需新型的解决方案以增强网络防护能力。数据可视化技术&#xff0c;作为一种将复杂数据转换为图…

Weblogic10.3.6补丁升级

由oracle官方发布的漏洞公告&#xff0c;对weblogic进行补丁升级。本文介绍的是weblogic安装的版本为10.3.6.0&#xff0c;如果你使用的是其他版本的请根据实际版本来选择下载 对于weblogic补丁升级&#xff0c;具体步骤如下&#xff1a; 1、首先需要下载weblogic补丁程序 2…

简单了解原型模式

什么是原型模式 区别于单例模式&#xff0c;原型模式的一个类可以有多个实例化的对象。 原型模式通过拷贝来产生新的对象&#xff0c;而不是new&#xff0c;并且可以根据自己的需求修改对象的属性。 实现Cloneable接口实现拷贝 而拷贝又分为浅拷贝和深拷贝&#xff0c;两者在…

AI赋能微服务:Spring Boot与机器学习驱动的未来应用开发

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面…

HarmonyOS入门--页面和自定义组件生命周期

文章目录 页面和自定义组件生命周期页面生命周期组件生命周期生命周期的调用时机 页面和自定义组件生命周期 生命周期流程如下图所示&#xff0c;下图展示的是被Entry装饰的组件&#xff08;首页&#xff09;生命周期。 自定义组件和页面的关系&#xff1a; 自定义组件&…

[flask]http请求//获取请求体数据

import jsonfrom flask import Flask, requestapp Flask(__name__)app.route("/form1", methods["post"]) def form1():"""获取客户端请求的请求体[表单]:return:""""""获取表单数据请求url&#xff1a;&qu…

网络安全卷么?

官方宣传的是对的网络安全现在是朝阳行业&#xff0c;缺口是很大 不过网络安全行业就是需要技术很多的人达不到企业要求才导致人才缺口大 初级的现在有很多的运维人员转网络安全&#xff0c;初级也会慢慢的卷起来&#xff0c;但是岗位多不用怕&#xff0c;以后各大去也都会要网…

Git Fork后的仓库内容和原仓库保持一致

Git Fork后的仓库内容和原仓库保持一致 ①Fork原仓库内容到自己仓库 ②将项目内容下载到本地 ③使用git命令获取原仓库内容&#xff0c;将原仓库的最新内容合并到自己的分支上并推送 下面从第三步开始演示~ 这里以码云上的若依项目为演示项目 ③使用git命令获取原仓库内容 …