5.【CPP】内存管理(text段data段bss段||nwedelete底层实现||源码)

news2024/11/20 9:28:51

一.内存管理

1.如图

在这里插入图片描述

2.heap下面的空间

在这里插入图片描述

应用程序加载到内存中由操作系统完成对bss,data,text,stack加载,并在内存分配空间。在编译阶段已经确定分配了多少空间,属于静态分配。
而malloc等在程序运行时在堆上开辟空间则属于动态分配,需要手动free掉开辟的空间,否则会造成内存泄漏。

text(代码段):用来存放程序执行代码的内存区域。在内存中被映射为只读,通常存一些只读的数据,如字符串常量。
data(数据段):通常用来存放程序中已初始化的(非 0)全局变量和静态局部变量。数据段的起始位置由链接定位文件确认,大小在编译链接时自动分配
bss 是英文 Block by Symbol 的简称。通常用来存放程序中未初始化和初始化为 0的全局变量的一块内存区域.
text 和 data 段都在可执行文件中,由系统从可执行文件中加载;而 bss 段不在可执行文件中,由系统初始化。那么就意味着一个很大的变量如果不初始化,那么编译后生成的文件要比初始化的小

3.验证一下

在这里插入图片描述
在这里插入图片描述
我们可以看到初始化后的test1编译后文件大小明显大于未初始化的test的文件大小,说明结论成立。

二.new 和delete

1.使用

int* p1=new int(10);//初始化一个int,值是10
int* p2=new int[10];//初始化一个int数组,大小为10,调用十次operator new

//c++11支持花括号初始化
int* p3=new int[10]{1,2,3,4,5} ;

delete p1;
delete [] p2;//要加括号析构十次,否则会报错
delete [] p3;

2.底层实现

/*
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_FINALLY
	
	return;
}
 
/*
free的实现
*/
#define free(p) _free_dbg(p, _NORMAL_BLOCK)

1.new和delete是操作符,实际调用了全局函数operator new和operator delete,底层也是通过malloc和free实现的。
2.相较于malloc/free,new和delete在堆上开空间的同时还调用了自定义类型的构造和析构函数,若空间开辟失败会抛异常(malloc会返回空指针)。
3.new 和delete要配套使用。

以上就是文章的全部内容,点赞支持!!!

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

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

相关文章

一网打尽 this,对执行上下文说 Yes

文章目录 全局环境下的 this上下文对象调用中的 thisbind/call/apply 改变 this 指向构造函数和 this箭头函数中的 this 指向this 优先级相关实现一个bind 函数 ✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人…

解读加密生态的未来:通过用户钱包画像分析预测市场趋势

作者:stellafootprint.network 加密生态领域变化莫测,但深入分析区块链数据,我们可以发现未来走势的线索。如果通过用户钱包画像分析,能够提前捕捉到这些信号,投资者是否能够抢占先机,领先市场&#xff1f…

Linux常用命令之vim、cat、grep

vim:编辑文件内容 cat&#xff1a;查看文件内容 grep:用于查找文件里符合条件的字符串 grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文…

Virtual Box安装Kali Linux 虚拟机

一、Kali Linux —— 安装和配置 Kali Linux 是道德黑客最好的安全软件包之一&#xff0c;包含一组按类别划分的工具。它是一个开源的系统&#xff0c;其官方网页是https://www.kali.org。 一般来说&#xff0c;Kali Linux 可以作为操作系统安装在机器上。Kali Linux提供了更…

接口自动化神器 apin【 快速入门篇】

关于自动化测试&#xff0c;这些年经历了太多的坑&#xff0c;有被动的坑&#xff0c;也有自己主动挖的坑&#xff0c;在这里做了一些总结。 一、apin 介绍及安装 1、什么是 apin apin是一个无需写代码&#xff0c;就可以进行接口自动化测试的框架&#xff0c;只需要通过jso…

02章【JAVA编程基础】

变量与标识符 变量 数学名词&#xff1a;变数或变量&#xff0c;是指没有固定的值&#xff0c;可以改变的数。变量以非数字的符号来表达&#xff0c;一般用拉丁字母。变量是常数的相反。变量的用处在于能一般化描述指令的方式。计算机解释&#xff1a;变量就是系统为程序分配…

【Spring 篇】深入探索:Spring集成Web环境的奇妙世界

嗨&#xff0c;亲爱的小白们&#xff01;欢迎来到这篇有关Spring集成Web环境的博客。如果你曾对如何在Spring中构建强大的Web应用程序感到好奇&#xff0c;那么这里将为你揭示Web开发的神秘面纱。我们将用情感丰富、语句通顺的文字&#xff0c;以小白友好的方式&#xff0c;一探…

DBeaver SQL脚本执行配置

对生产环境数据迁移到测试环境时&#xff0c;单条执行可能时间过长、或者内存装不下。最快的方法是执行SQL脚本。 本地数据库客户端&#xff1a;DBeaver 该客户端是不自带脚本执行客户端的&#xff0c;如下图&#xff1a; mysql官网下载workbench&#xff0c;可以连通客户端执…

CDMP认证与CDGA/CDGP的区别有哪些?

&#x1f451;CDMP是DAMA国际组织的全英文考试 &#x1f308;CDGA和CDGP是DAMA中国主导&#xff0c;考试为中文考试。需要在规定的时间内报名后&#xff0c;参加线下笔试考试。 &#x1f44d;CDGA、CDGP证书和英文版的CDMP证书都是国际通用的&#xff0c;是数据管理领域专业的职…

嵌入式工作岗位未来会不会越来越少?

今日话题&#xff0c;嵌入式工作岗位未来会不会越来越少&#xff1f;未来的嵌入式岗位机会将会逐渐增多&#xff0c;因为嵌入式技术是万物互联的基础&#xff0c;从智能手表到智能汽车&#xff0c;嵌入式都扮演着关键角色。虽然相比计算机科学CS&#xff0c;嵌入式领域的天花板…

Klocwork—符合功能安全要求的自动化静态测试工具

产品概述 Klocwork是Perforce公司产品&#xff0c;主要用于C、C、C#、Java、 python和Kotlin代码的自动化静态分析工作&#xff0c;可以提供编码规则检查、代码质量度量、测试结果管理等功能。Klocwork可以扩展到大多数规模的项目&#xff0c;与大型复杂环境、各种开发工具集成…

ACM:每日学习 状压dp

状压dp&#xff1a; 状压dp是对一般dp的改进&#xff1a; //对于判断多种物品的取法&#xff0c;开多维数组比较麻烦&#xff0c;也不好开&#xff0c;使用二进制来表示物品的取与否。 //使用二进制的话&#xff0c;位运算就更能省时间了&#xff0c;而且更会节省空空间&…

3D Guassians Splatting相关解读

从已有的点云模型出发&#xff0c;以每个点为中心&#xff0c;建立可学习的高斯表达&#xff0c;用Splatting即抛雪球的方法进行渲染&#xff0c;实现高分辨率的实时渲染。 1、主要思想 1.引入了一种各向异性&#xff08;anisotropic&#xff09;的3D高斯分布作为高质量、非结…

实战 php 使用 wkhtmltopdf 生成pdf的全过程

公司里边有生成pdf报告的业务需求,之前有过尝试用tcpdf,直接生成的pdf的过程,但是pdf报告的内容数据,根据不同内容的变化,都是各种各样的bug,一直处理修修补补的状态,让后台开发人员很是头疼. 经过思索和甄选,总结出我们的业务中是由于样式不可控导致的,当时从逻辑上就思考到用…

CHS_06.2.1.6_2+线程的实现方式和多线程模型

CHS_06.2.1.6_2线程的实现方式和多线程模型 知识总览线程的实现方式用户级线程&#xff08;User-Level Thread, ULT&#xff09;内核级线程 多线程模型一对一模型多对一多对多模型 知识回顾 在上个小节中 我们学习了线程相关的一些基本概念 基础的知识 那这个小节中 我们回来看…

人脸识别打卡系统的设计与应用!人脸识别打卡系统有什么用?

教育行业的快速日新月异&#xff0c;对信息化建设的要求也越来越高。学校物业管理成为保障学校正常运行的重要环节。然而&#xff0c;在实践中&#xff0c;由于服务人员数量不足、管理不规范等问题&#xff0c;服务质量往往难以保证物业对学校师生的服务质量。为了解决这一问题…

如果你正在学自动化测试,那么请你仔细看完这篇文章

接触了不少同行&#xff0c;由于他们之前一直做手工测试&#xff0c;现在很迫切希望做自动化测试&#xff0c;其中不乏工作5年以上的人。 本人从事软件自动化测试已经近5年&#xff0c;从server端到web端&#xff0c;从API到mobile&#xff0c;切身体会到自动化带来的好处与痛楚…

高级 Python 面试问题与解答

文章目录 专栏导读1.什么是PIP&#xff1f;2.什么是 zip 函数&#xff1f;3.Python 中的 __init __ () 是什么&#xff1f;4.Python 中的访问说明符是什么&#xff1f;5.Python 中的单元测试是什么&#xff1f;6.Python全局解释器锁&#xff08;GIL&#xff09;&#xff1f;7.P…

linux yum仓库

yum是基于rpm包构建的软件更新机制&#xff0c;能够自动解决软件包之间的依赖关系。 常用命令 查询 yum list [软件名] 显示可用的安装包&#xff0c;如果不加软件名则显示所有的可用包 yum info [软件名] 显示安装包的详细信息 如果不加软件名是显示所有包…

CF1178F2 Long Colorful Strip 题解 搜索

Long Colorful Strip 传送门 题面翻译 题目描述 这是 F 题的第二个子任务。F1 和 F2 的区别仅在对于 m m m 和时间的限制上 有 n 1 n1 n1 种颜色标号从 0 0 0 到 n n n&#xff0c;我们有一条全部染成颜色 0 0 0 的长为 m m m 的纸带。 Alice 拿着刷子通过以下的过…