c++中的内存分区模型

news2024/11/26 15:32:43

内存分区模型

  • c++程序在执行时,将内存大方向划分为4个区域
  • 1、代码区:存放函数体的二进制代码,由操作系统进行管理
  • 2、全局区:存放全局变量和静态变量以及常量
  • 3、栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
  • 4、堆区:由程序员分配和释放,若程序员不释放,程序员结束时由操作系统回收
  • 内存四区意义:不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程

程序运行前

  • 在程序编译后,生成可执行程序,未执行该程序前分为两个区域
  • 代码区:
  •    存放cpu执行的机器指令
    
  •    代码区时共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
    
  •    代码区是只读的,使其只读的原因是防止程序以外的修改了他的指令
    
  • 全局区:
  •    全局变量和静态变量存放在此
    
  •    全局区还包含了常量区,字符串常量和其他常量也存放在此
    
  •    该区域的数据在程序结束后由操作系统释放
    

程序运行后

  • 栈区:
  •  由编译器自动分配释放,存放函数的参数值,局部变量等
    
  •  注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
    

堆区

  • 由程序员分配释放,若程序员不释放,程序结束时由操作系统会回收
  • 在c++中主要利用new在堆区开辟内存

new操作符

  • c++中利用操作符在堆区开辟数据
  • 堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符delete
  • 语法:new 数据类型
  • 利用new创建的数据,会返回该数据对应的类型的指针
#include<iostream>
using namespace std;
//全局变量
int a = 1;
int b = 2;

//const修饰的全局常量
const int h = 7;

int * func()          //形参数据也会放在栈区
{
	int x = 123;     //局部变量,存放在栈区,栈区的数据在函数执行完后自动释放
	return &x;       //返回局部变量的地址
}

int * func1()
{
	int * a = new int(10);   //利用new关键字,可以将数据开辟到堆区。  指针:本质也是局部变量,放在栈上,指针保存的数据是放在堆区
	return a;
}

int* func2()
{
	int* b = new int(10);   //在堆区创建整型数据,new返回的是该数据类型的指针
	return b;
}
void test2()
{
	int* y = func2();
	cout << *y << endl;//堆区的数据由程序员管理开辟,程序员管理释放
	delete y;          //释放堆区的数据
	//cout << "释放数据之后:" << *y << endl;//此时的指针是空指针,再次访问就是非法操作,运行会报错
}
//在堆区利用new开辟数组
void tast3()
{
	int* arr = new int[10];
	for (int i = 0; i < 10; i++)
	{
		arr[i] = i + 100;
	}
	for (int j = 0; j < 10; j++)
	{
		cout << arr[j] << "  ";
	}
	cout << endl << endl;
}

int main()
{
	//局部变量
	int c = 3;
	int d = 4;
	//静态变量
	static int e = 5;
	static int f = 6;

	//常量包括:字符串常量;const修饰的常量
	
	//字符串常量
	string g = "hello world!";
	//const修饰的常量:const修饰的全局常量、const修饰的局部常量
	const int i = 8;

	test2();
	tast3();
	

	int* p = func();
	cout << "第一次打印局部变量p:" << *p << endl << endl;//第一次打印正确的数字,是因为编译器做了保留(仅限x86系统)
	cout << "第二次打印局部变量p:" << *p << endl << endl;//第二次打印这个数据就不再保留了(仅限x86系统)

	int* q = func1();
	cout << "第一次打印局部变量q:" << *q << endl << endl;//第一次打印正确的数字,是因为编译器做了保留(仅限x86系统)
	cout << "第二次打印局部变量q:" << *q << endl << endl;//第二次打印这个数据就不再保留了(仅限x86系统)

	

	cout << "全局变量a的地址为" << (int)&a << endl << endl;
	cout << "全局变量b的地址为" << (int)&b << endl << endl;
	cout << "局部变量c的地址为" << (int)&c << endl << endl;
	cout << "局部变量d的地址为" << (int)&d << endl << endl;
	cout << "静态变量e的地址为" << (int)&e << endl << endl;
	cout << "静态变量f的地址为" << (int)&f << endl << endl;
	cout << "字符串常量g的地址为" << (int)&g << endl << endl;
	cout << "const修饰的全局常量h的地址为" << (int)&h << endl << endl;
	cout << "const修饰的局部常量i的地址为" << (int)&i << endl << endl;
	//cout << "静态变量f的地址为" << (int)&f << endl << endl;



	system("pause");
	return 0;
}

在这里插入图片描述

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

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

相关文章

手把手教你使用Vue3指定状态管理库--Pinia

什么是 Pinia Pinia 与 Vuex 一样&#xff0c;是作为 Vue 的“状态存储库”&#xff0c;用来实现 跨页面/组件 形式的数据状态共享。 在平时的开发过程中&#xff0c;Vue 组件之间可以通过 Props 和 Events 实现组件之间的消息传递&#xff0c;对于跨层级的组件也可以通过 Ev…

Java并发编程实战读书笔记三

第七章 取消和关闭 Java没有提供任何机制来安全的终止线程&#xff0c;虽然 Thread.stop 和 suspend 等方法提供了这样的机制&#xff0c;但由于存在着一些严重的陷&#xff0c;因此应该避免使用 7.1任务取消 7.1.1 中断 取消任务中生产者使用了队列的put操作导致阻塞后任务…

day14_类中成员之构造器

由来 我们发现我们new完对象时&#xff0c;所有成员变量都是默认值&#xff0c;如果我们需要赋别的值&#xff0c;需要挨个为它们再赋值&#xff0c;太麻烦了。我们能不能在new对象时&#xff0c;直接为当前对象的某个或所有成员变量直接赋值呢。可以&#xff0c;Java给我们提…

工作两年,没想到靠Python搞副业让我实现了财务自由

前言 国庆假期和好友聚会&#xff0c;聊了各自近两年的变化&#xff0c;朋友的经历让我大吃一惊&#xff01; 2年前他还是月薪5千的小编&#xff0c;现在轻松实现月入5万的小目标。 &#xff08;文末送读者福利&#xff09; 原来是利用空余时间学会了Python编程&#xff0c…

TPM零知识学习二—— 相关链接和页面

TPM2社区的主页地址为&#xff1a;https://tpm2-software.github.io/ 页面如下&#xff1a; 主页中提供了很多有用的链接&#xff0c;包括&#xff1a; Software | tpm2-software community 页面如下&#xff1a; External | tpm2-software community 页面如下&#xff1a;…

《计算机体系结构量化研究方法》1.8 性能的测量、报告和汇总

引入 1、一些概念 响应时间&#xff1a;手机用户所关注的“速度”&#xff0c;也就是一个事件从启动到完成的时间&#xff0c;又称为执行时间。 吞吐量&#xff1a;给定时间内完成的总工作量&#xff0c;WSC的操作人员关注这个。 执行时间是性能的倒数&#xff08;即执行时间…

DSP之Controlsuit和C2000Ware下载安装

DSP之Controlsuit和C2000Ware下载安装 Controlsuit 用于 C2000TM 微处理器的 controlSUITETM 是一套全面的软件基础设施和软件工具集&#xff0c;旨在最大程度地缩短软件开发时间。从特定于器件的驱动程序和支持软件到复杂系统应用中的完整系统示例&#xff0c;controlSUITET…

Redis击穿、穿透、雪崩

Redis 的基本概念 在没有添加 Redis 的时候&#xff0c;后端的查询流程是&#xff1a; 用户访问页面-请求后端服务-经过逻辑处理后&#xff0c;去数据库查询信息。 在添加 Redis 的之后&#xff0c;后端的查询流程是&#xff1a; 用户访问页面-请求后端服务-经过逻辑处理后&a…

超强AI绘图-文生图

一、前言 前面汇总了四种AI绘图的方法&#xff0c;详情可以点击下图跳转到文章《AI绘画合集&#xff08;11月汇总&#xff09;》。主要内容是&#xff1a;具象意象派AI作图、AI绘制专属动漫头像、基于ViLG模型AI 作画。点击下面文章跳转&#xff01; 《AI绘图—对中文拟合度…

LabVIEW创建类 3

LabVIEW创建类 3 继承 通过“继承”可在现有类的基础上创建新类。若创建一个新的LabVIEW类并将它设置为继承另一个类的数据及成员VI&#xff0c;这个新类将可使用它所继承的类中“公共”及“保护”型的成员VI。这个新类还可添加自己的数据和成员VI以丰富其功能。例如&#xf…

聚观早报 | 脸书泄露数据被罚20亿;iPhone15将全系支持灵动岛

今日要闻&#xff1a;脸书泄露数据被罚20亿&#xff1b;iPhone15将全系支持灵动岛&#xff1b;540万推特用户数据被盗&#xff1b;罗永浩入局tiktok&#xff1b;特斯拉研发改款Model3脸书泄露数据被罚20亿 据报道&#xff0c;脸书因泄露5亿用户数据&#xff0c;被欧洲监管机构罚…

Starday为什么是跨境电商卖家的不二之选?

据国内海关统计显示&#xff0c;近5年来&#xff0c;中国跨境电商规模增长近10倍&#xff0c;年增长率在30%以上&#xff0c;占国际贸易近40%。基于流量模式的跨境电商直播、垂直跨境电商等新模式蓬勃发展&#xff0c;近几年跨境电商一直不断地在深度融合发展&#xff0c;加之疫…

WSL Ubuntu20.04安装pycairo指南

环境说明 wsl Ubuntu20.04 走过的一些可能有用的弯路 由于pycairo要求python3.7&#xff0c;但是之前Ubuntu上有个3.6的python环境&#xff0c;所以就安装了python3.8&#xff1a; sudo apt install python3.8然后python3命令还是链接到python3.6&#xff0c;结果就yongln …

Stateflow状态转移练习

文章目录1.外部转移与内部转移1.1 stateflow1.2 分析2.外部转移内部转移超转移2.1 stateflow2.2 video1.外部转移与内部转移 1.1 stateflow 1.2 分析 首先是 xyz0&#xff0c;然后进入 A 状态&#xff0c;此时 A 的 en 激活&#xff0c;xx1&#xff0c;即 x1其次进入默认状态…

聊天软件im即时通讯源码酷信视酷,在线语音视屏通话端对端加密聊天,支持7端互通带部署教程

APP端有安卓端苹果端&#xff0c;PC端&#xff0c;web端&#xff0c;管理端有PC后台&#xff01; .产品为独立开发&#xff0c;非网上下载不能用的产品&#xff01; .高端产品&#xff0c;即时聊天软件技术难度大&#xff0c;请不要拿网络其他聊天软件来对比&#xff0…

多线程,了解-概念-实现方式-常见方法-安全问题-死锁-生产者消费者

了解 简单了解多线程 是指从软件或者硬件上实现多个线程并发执行的技术。 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程&#xff0c;提升性能。 简单了解多线程 简单了解多线程 简单了解多线程 简单了解多线程 概念 线程相关的概念 并行&#xff1a;在同…

【Linux进阶】-- 1.python脚本实现守护进程daemon调度,启停等

"怀斯曼不蒸汽啊"1. Linux守护进程介绍1.1 查看进程2. python指令for linux2.1 运行shell命令3. 代码讲解3.1 创建守护进程文件pre_deal.py3.2 用脚本运行3.3 用一个python程序来管理该任务任务介绍: 首先python创建文件1,作用是创建一个守护进程,内容是持续输出时间…

<C++>手撕搜索二叉树

目录 一、搜索二叉树的性质 二、搜索二叉树的结构定义 三、手撕搜索二叉树非递归 1&#xff09;Insert() 2&#xff09;Find() 3&#xff09;Erase() 4&#xff09;InOder() 5&#xff09;BSTree(const BSTree& t) 拷贝构造 6&#xff09;~BSTree()析构函数 四、手…

【学习笔记65】JavaScript的继承

一、认识继承 function Person(name) {this.name name}Person.prototype.sayName () > {console.log(name)}function Stu(age) {this.age age}const s new Stu(18)console.log(s) // {age: 18} 说明&#xff1a; 想让s这个对象内部有一个name属性, 并且可以使用 sayN…

双功能连接试剂:Alkyne hydrazide,炔烃-酰肼 主要特点进行分享

Alkyne hydrazide物理参数&#xff1a; CAS号&#xff1a;N/A |英文名&#xff1a;Alkyne hydrazide | 中文名&#xff1a;炔烃-酰肼 货号&#xff1a;X-CL-1132 分子式&#xff1a;C6H11ClN2O 分子量&#xff1a;162.62 纯度&#xff1a;95% 外形&#xff1a;淡黄色或白…