【C++】C++的内存模型之四大分区

news2024/11/29 6:31:41

程序的内存模型

C++程序在执行时,将内存大方向划分为4个区域

  • 代码区:存放函数体的二进制代码,由操作系统进行管理的
  • 全局区:存放全局变量和静态变量以及常量
  • 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
  • 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

在这里插入图片描述

1.1程序运行前

在程序编译后,生成了exe可执行程序,**【未执行该程序前】**分为两个区域

代码区:

存放CPU执行的机器指令

代码区是**【共享】**的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可

代码区是【只读】的,便其只读的原因是防止程序意外地修改了它的指令

全局区:

全局变量和静态变量存放在此

全局区还包含了常量区字符串常量其他常量存放在此

该区域的数据在程序结束后由操作系统释放

//全局变量
int g_a = 10;
int g_b = 10;

//全局常量
const int c_g_a = 10;
const int c_g_b = 10;

int main() {

	//局部变量
	int a = 10;
	int b = 10;

	//打印地址
	cout << "局部变量a地址为: " << (int)&a << endl;
	cout << "局部变量b地址为: " << (int)&b << endl;

	cout << "全局变量g_a地址为: " <<  (int)&g_a << endl;
	cout << "全局变量g_b地址为: " <<  (int)&g_b << endl;

	//静态变量
	static int s_a = 10;
	static int s_b = 10;

	cout << "静态变量s_a地址为: " << (int)&s_a << endl;
	cout << "静态变量s_b地址为: " << (int)&s_b << endl;

	cout << "字符串常量地址为: " << (int)&"hello world" << endl;
	cout << "字符串常量地址为: " << (int)&"hello world1" << endl;

	cout << "全局常量c_g_a地址为: " << (int)&c_g_a << endl;
	cout << "全局常量c_g_b地址为: " << (int)&c_g_b << endl;

	const int c_l_a = 10;
	const int c_l_b = 10;
	cout << "局部常量c_l_a地址为: " << (int)&c_l_a << endl;
	cout << "局部常量c_l_b地址为: " << (int)&c_l_b << endl;

	system("pause");

	return 0;
}

在这里插入图片描述

在这里插入图片描述

总结:

  • C++中在程序运行前分为全局区和代码区
  • 代码区特点是共享和只读
  • 全局区中存放全局变量、静态变量、常量
  • 常量区中存放 const修饰的全局常量 和 字符串常量

1.2程序运行后

栈区:

由编译器自动分配释放,存放函数的参数值(形参),局部变量等

注意事项:不要返回局部变量的地址,栈区开辟的数据【由编译器自动释放】

示例:

int * func()
{
	int a = 10;
	return &a;
}

int main() {

	int *p = func();

	cout << *p << endl;
	cout << *p << endl;//两个*p不一样因为存放在栈区

	system("pause");

	return 0;
}

堆区:

由程序员分配释放,若程序员不释放,程序结束时由操作系统回收

在C++中主要利用new在堆区开辟内存

示例:

int* func()
{
	int* a = new int(10);
	return a;
}

int main() {

	int *p = func();

	cout << *p << endl;
	cout << *p << endl;//两个p值一样,因为存放在堆区
    
	system("pause");

	return 0;
}

总结:

堆区数据由程序员管理开辟和释放

堆区数据利用new关键字进行开辟内存

1.3 new操作符

​ C++中利用**【new】**操作符在堆区开辟数据

​ 堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符**【delete】**

​ 语法: new 数据类型

​ 利用new创建的数据,会返回该数据对应的类型的指针

示例1: 基本语法

int* func()
{
	int* a = new int(10);
	return a;
}

int main() {

	int *p = func();

	cout << *p << endl;
	cout << *p << endl;

	//利用delete释放堆区数据
	delete p;

	//cout << *p << endl; //报错,释放的空间不可访问

	system("pause");

	return 0;
}

示例2:开辟数组

//堆区开辟数组
int main() {

	int* arr = new int[10];

	for (int i = 0; i < 10; i++)
	{
		arr[i] = i + 100;
	}

	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << endl;
	}
	//释放数组 delete 后加 []
	delete[] arr;//释放堆空间中的数组

	system("pause");

	return 0;
}

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

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

相关文章

CIMCAI intelligent tally shore AI auto container damage detect

全球港航人工智能/集装箱人工智能领军者CIMCAI&#xff0c;世界首创港口岸边超级智能理货产品自动化AI验箱&#xff0c;AI自动化码头港口数字化港口。中集飞瞳CIMCAI领跑全球港口码头人工智能科技&#xff0c;领先集装箱箱况残损识别科技全方位提升港口码头效能。集装箱残损可能…

剑指 Offer 68 - I. 二叉树的最近公共祖先

摘要 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 剑指 Offer 68 - II. 二叉树的最近公共祖先 一、二叉搜索树的最近公共祖先 注意到题目中给出的是一棵二叉搜索树&#xff0c;因此我们可以快速地找出树中的某个节点以及从根节点到该节点的路径&#xff0c;例如我们需要找…

2023年金三银四必备软件测试常见面试题1500问!!!

十九、持续集成19.1 jenkins ant jmeter svn接口自动化测试?jenkins ant jmeter svn环境搭建原来这个环境是我这边搭建的&#xff0c;主要是几个步骤&#xff0c;第一Jenkins安装、第二&#xff0c;ant安装、第三&#xff0c;jmeter安装、第四&#xff0c;jmeter与ant连…

HTML基础(1)

HTML基础HTML基本介绍编辑工具HTML概述多如牛毛的标签头部标签&#xff1a;标题与段落标签&#xff1a;br换行符&#xff1a;a href超链接标签&#xff1a;< meta > 元素标签&#xff1a;主体标签HTML注释&#xff1a;水平线标签hr&#xff1a;段落标签p&#xff1a;文本…

[ 常用工具篇 ] 多媒体视频处理工具 ffmpeg 安装使用详解

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

【python学习笔记】:字符串编码转换

在 Python 中&#xff0c;有 2 种常用的字符串类型&#xff0c;分别为 str 和 bytes 类型&#xff0c;其中 str 用来表示 Unicode 字符&#xff0c;bytes 用来表示二进制数据。str 类型和 bytes 类型之间就需要使用 encode() 和 decode() 方法进行转换。 Python encode()方法 …

软件工程(4)--螺旋模型

前言 这是基于我所学习的软件工程课程总结的第四篇文章。 在软件开发过程中必须及时识别和分析风险&#xff0c;并且采取适当措施以消除或减少风险的危害。构建原型是一种能使某些类型的风险降至最低的方法。为了降低交付给用户的产品不能满足用户需要的风险&#xff0c;一种行…

LeetCode 725. 分隔链表

LeetCode 725. 分隔链表 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 给你一个头结点为 headheadhead 的单链表和一个整数 kkk &#xff0c;请你设计一个算法将链表分隔为 kkk 个连续的部分。 每部分的长度应该尽可能的相等&#xff1a;任意两部分的长度差…

〖产品思维训练白宝书 - 核心竞争力篇⑯〗- 产品经理核心竞争力解读之如何学习的又快又好并学以致用

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

前端算法codewhy第一章: 邂逅数据结构与算法

第一章: 邂逅数据结构与算法 编程的真相 – 数据的处理 数据结构与算法的本质 学习数据结构与算法到底有什么实际应用&#xff1f; 源码中的数据结构 如何学习数据结构与算法&#xff1f; TypeScript常见数据结构与算法 到底什么是数据结构 什么是数据结构&#xff08;Data Str…

数据库系统之并发控制(重点标记)

1. 并发控制概述 事务是并发控制的基本单位&#xff0c;并发控制机制的任务是&#xff1a; 对并发操作进行正确调度。保证事务的隔离性。保证数据库的一致性。 数据不一致及其原因 并发操作带来的数据不一致性主要包括丢失修改&#xff0c;不重复读和读“脏”数据。产生三类数…

Appium自动化测试 Inspector定位Webview/H5页面元素

目录操作步骤Python操作该混合App代码Appium在操作混合App或Android App的H5页面时, 常常需要定位H5页面中的元素, 传统方式是 FQ 使用Chrome://inspect来定位元素, 环境准备相当繁琐, 不仅需要想办法FQ, 而且还需要Android设备安装Google框架以及手机版Chrome浏览器以及相应的…

图片分类 STL-10 数据集下载及使用指南

转载自安全验证 - 知乎 这次给大家介绍的 STL10数据集&#xff0c;是图片分类任务早期常用的基准数据集之一&#xff0c;虽然只有10种样本&#xff0c;图片尺寸也偏小&#xff0c;但是标注类型比较平衡&#xff0c;各种种类都有各500张&#xff08;train&#xff09;/800张&am…

深度解析linux的文件系统

背景&#xff1a;虚拟文件系统&#xff08;有时也称作虚拟文件交换&#xff0c;更常见的是简称VFS)作为内核子系统&#xff0c;为用户空间程序提供了文件和文件系统相关的接口。系统中所有文件系统不但依赖VFS共存&#xff0c;而且也依靠VFS系统协同工作。通过虚拟文件系统&…

动态规划(一):01背包问题和完全背包问题

动态规划 目录动态规划1.01背包问题1.1题目介绍1.2思路一介绍(二维数组)1.3思路二介绍(一维数组) 空间优化1.4思路三介绍(输入数据优化)2.完全背包问题2.1题目描述&#xff1a;2.2思路一(朴素算法)2.3思路二(将k优化处理掉)2.4思路三(优化j的初始条件)总结1.01背包问题 1.1题目…

求职-进度

2-23 投递 恒生校招 C https://campus.hundsun.com/personal/deliveryRecord 投递 合合信息 大数据开发工程师 https://intsig.zhiye.com/personal/deliveryRecord 投递 尚游网络 游戏服务器开发工程师 https://app.mokahr.com/campus_apply/shangyou/36582?recommendCodeDS…

项目管理中,哪些信息差是不应该存在的呢?

在项目管理中&#xff0c;如果存在信息差&#xff0c;那么就会存在了巨大的问题&#xff0c;从而导致项目的失败。 项目管理中哪些信息差是不应该存在的呢&#xff1f; 1、项目背景 项目经理接手项目&#xff0c;首先要了解清楚项目背景&#xff0c;避免在项目过程中对自己…

计算句子向量相似度:SentenceBert和SimCSE

SentenceBert Sentence-BERT: 如何通过对比学习得到更好的句子向量表示 - 哔哩哔哩 (bilibili.com) (229条消息) Sentence-BERT详解_数学家是我理想的博客-CSDN博客_sentence-bert 动机&#xff1a; 直接把2个句子串联起来输入Bert做分类&#xff08;即Cross-Encoder方式&…

Blazor入门100天 : 身份验证和授权 (6) - 使用 FreeSql orm 管理ids数据

目录 建立默认带身份验证 Blazor 程序角色/组件/特性/过程逻辑DB 改 Sqlite将自定义字段添加到用户表脚手架拉取IDS文件,本地化资源freesql 生成实体类,freesql 管理ids数据表初始化 Roles,freesql 外键 > 导航属性完善 freesql 和 bb 特性 本节源码 https://github.com/…

Maven基础-又简单又详细

如果文章对你有帮助欢迎【关注❤️❤️❤️点赞&#x1f44d;&#x1f44d;&#x1f44d;收藏⭐⭐⭐】一键三连&#xff01;一起努力&#xff01; 一、Maven简介 1、maven是什么 Maven的本质是一个项目管理工具&#xff0c;将项目开发和管理过程抽象成一个项目对象模型&#x…