C++ 内存模型

news2025/1/31 8:08:30

1、内存分区模型

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

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

内存四区意义:

        不同区域存放的数据,赋予不同的生命周期, 给我们更大的灵活编程

 2、程序运行前

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

代码区:

​         存放 CPU 执行的机器指令

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

​         代码区是只读的使其只读的原因是防止程序意外地修改了它的指令

全局区:

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

​         全局区还包含了常量区, 字符串常量和其他常量也存放在此.

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

总结:

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

3、程序运行后

栈区:

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

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

 示例:

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

int main() {

	int *p = func();

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

	system("pause");
	return 0;
}

堆区:

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

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

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

int main() {

	int *p = func();

	cout << *p << endl;
	cout << *p << endl;
    
	system("pause");
	return 0;
}

4 、new操作符

  • C++中利用new操作符在堆区开辟数据
  • 堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 :delete

​         语法:new 数据类型

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

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

int main() {

	int *p = func();

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

    // 堆区的数据,由程序员管理开辟(new),程序员管理释放(delete)
	// 利用delete释放堆区数据
	delete p;

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

	system("pause");
	return 0;
}

示例:开辟数组

//堆区开辟数组
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/39793.html

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

相关文章

使用 Clion (cmake) 运行FreeRTOS

这里使用的是 f4071. 先用STM32CubeMX 建立一个可以运行的stm32项目&#xff0c;toolchain选择 SW4STM322. 官网下载源码www.freertos.org我这里下载的是FreeRTOSv202112.00.zip 解压缩后得到需要以下几个文件夹或档案FreeRTOS/Source下的所有的 .c 档案FreeRTOS/Source/includ…

【附源码】计算机毕业设计JAVA在线图书超市

【附源码】计算机毕业设计JAVA在线图书超市 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA mybati…

算法刷题打卡第28天:省份数量---广度优先搜索

省份数量 难度&#xff1a;中等 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市&#xff0c;组内不…

BP神经网络PID控制从Simulink仿真到PLC控制实现(含博途PLC完整SCL源代码)

单神经元自适应PID控制博途PLC完整源代码,请参看下面的文章链接: 博途PLC单神经元自适应PID控制_RXXW_Dor的博客-CSDN博客_单神经元pid控制1、单神经元作为构成神经网络的基本单位,具有自学习和自适应能力,且结构简单易于计算,传统的PID具有结构简单、调整方便和参数整定…

数据结构 | 树和二叉树的基本概念和性质【考点精析】

树和二叉树&#x1f333;树&#x1f343;树的概念&#x1f343;树的相关概念&#x1f343;树的性质和常用公式总结 ⭐⭐⭐⭐⭐&#x1f343;树的表示&#x1f343;树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09;&#x1f333;二叉树&#x1f343;二叉树的概…

我与世界杯足球那些事——世界杯征文

征文活动链接&#xff1a; https://bbs.csdn.net/topics/609601920 目录 第一次了解世界杯 第一次观看世界杯 世界杯主题曲 我最热爱的球员 今年世界杯 预测冠军 第一次了解世界杯 提起世界杯&#xff0c;我可能了解的比较晚一些&#xff0c;是在2014年的巴西世界杯的时…

浏览器扩展课程Manifest V3升级版

大家好&#xff0c;经过一段时间的整理&#xff0c;我的《浏览器扩展插件开发》视频课程做了全新的升级。之前的课程也收到了很多反馈。因为Chrome浏览器扩展发布了最新的Manifest V3标准&#xff0c;简写MV3&#xff0c;也发布了新的路线图。2022年1月份开始不接受新的MV2版本…

人工智能CV应用现状与发展 - 讲座记录

简单介绍 ✅CV应用现状与发展前景如何&#xff1f; ✅算法工程师如何自我修炼&#xff1f; CV应用现状与发展前景如何&#xff1f; 模型训练好后&#xff0c;新增场景case,则需要再次进行模型训练。模型固化。 硬件部署&#xff0c;也固化&#xff0c;不同模型部署在不同硬件…

12.PGL图学习之项目实践(UniMP算法实现论文节点分类、新冠疫苗项目实战,助力疫情)[系列九]

原项目链接&#xff1a;https://aistudio.baidu.com/aistudio/projectdetail/5100049?contributionType1 1.图学习技术与应用 图是一个复杂世界的通用语言&#xff0c;社交网络中人与人之间的连接、蛋白质分子、推荐系统中用户与物品之间的连接等等&#xff0c;都可以使用图…

高并发场景下更新数据库报错,记录一次 MySQL 死锁问题的解决

今天隔壁项目组的开发小姐姐找到我&#xff0c;说她们项目正在做压力测试&#xff0c;更新 MySQL 数据库的一张表时&#xff0c;总是发生死锁&#xff0c;日志大概是这个样子的&#xff1a; org.springframework.dao.DeadlockLoserDataAccessException: ### Error updating d…

Java常用类(一)

目录 字符串相关的类 一、String String的特性 String不可变性的体现 String的实例化方式一&#xff1a;字面量的定义方式 String实例化方式二&#xff1a;通过new构造器的方式 字符串的特性 String使用陷阱 面试题 String的常用方法 ​编辑 String与基本数据类型转换 …

TFT-LCD LVGL官方例程的应用

TFT-LCD LVGL官方例程的应用 移植完lvgl的源码和驱动后&#xff0c;就可以试着调用lvgl的官方例程来运行了&#xff1b;例程的目录如下 官方demo是一些比较完整的界面&#xff0c;文件夹里面有.gif的动态图展示&#xff0c;而类型和小部件适合根据需要做一个自己喜欢的界面&am…

TensorRT--学习笔记

官方文档是最权威的TensorRT是可以在NVIDIA各种GPU硬件平台下运行的一个C推理框架。利用Pytorch、TF或者其他框架训练好的模型&#xff0c;可以转化为TensorRT的格式&#xff0c;然后利用TensorRT推理引擎去运行我们这个模型&#xff0c;从而提升这个模型在英伟达GPU上运行的速…

【学习笔记38】JavaScript中的本地存储

一、localStorage 浏览器的本地存储(永久存储), 打开浏览器存储上之后, 关闭浏览器, 信息还在语法&#xff1a;window.localStorage.setItem(key, value)注意: value的值必须为字符串key的书写符合见名知意 window.localStorage.setItem(ceshi1, 1111111);window.localStorage.…

16.预处理、动态库、静态库

C语言编译过程 1.预处理 将.c中的头文件展开、宏展开 生成的文件是.i文件 2.编译 将预处理之后的.i文件生成.s汇编文件 3.汇编 将.s汇编文件生成.o目标文件 4.链接 将.o文件链接成目标文件&#xff08;可执行程序&#xff09; Linux下GCC编译器编译过程 gcc -E hello.c -o he…

C++11标准模板(STL)- 算法(std::upper_bound)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 返回指向第一个大于给定值…

[附源码]Python计算机毕业设计钓鱼爱好者交流平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Java项目:电器商城系统(java+SSM+JSP+jQuery+javascript+Mysql)

源码获取&#xff1a;俺的博客首页 "资源" 里下载&#xff01; 项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 修改个人信息,员工信息管理,商品管理,图片管理,图表管理,用户…

解决vscode远程安装插件不了、安装太慢问题

一、问题描述 一直显示正在安装&#xff0c;几个小时也没动静&#xff0c;特别是那个c/c插件的安装。 二、解决方法 1、采用手动安装插件的方式 步骤&#xff1a; ①、先去这个网站找你要安装的插件&#xff0c;然后下载到本地电脑。 All categories Extensions - Visual Studi…

分汤000

题目链接 分汤 题目描述 注意 没有提供 0ml 的 汤A 和 100ml 的 汤B 这种操作如果汤的剩余量不足以完成某次操作&#xff0c;我们将尽可能分配 解答思路 由题意得&#xff0c;首先想到的是动态规划&#xff0c;关键是规律以及终止条件是怎样的由于分汤都是在25的倍数上进行…