C++学习 --内存四区

目录

1, 内存四区

1-1, 代码区

1-1-2, 特点

1-2, 全局区

1-2-1, 全局变量

1-2-2, 静态变量

1-2-3, 全局常量

1-3, 栈区

1-4, 堆区

1-4-1, new单个对象

1-4-2, delete单个对象

1-4-3, new&delete数组


1, 内存四区

四区中的数据,具有不同生命周期

1-1, 代码区

代码区存放的是编译后的C++代码二进制文件

1-1-2, 特点

特点共享、只读, 共享是只内存中的该段二进制文件可以反复执行,只读是指存放后的二进制文件不能被修改

1-2, 全局区

全局区存放的是C++代码的全局变量, 静态变量, 全局常量, 字符串常量的地方, 程序结束后由操作系统释放

1-2-1, 全局变量

全局变量为在函数外定义的变量

#include <iostream>
#include <string>using namespace std;/*全局变量存放在全局区,程序运行结束后由操作系统释放*///定义全局变量
int global_a = 10;
int global_b = 10;int main()
{int local_a = 10;int local_b = 20;cout << "局部变量的地址local_a:" << &local_a <<endl;cout << "局部变量的地址local_b:" << &local_b <<endl;cout << "全局变量的地址global_a:" << &global_a << endl;cout << "全局变量的地址global_b:" << &global_b << endl;system("pause");return 0;
}------------------------------------------------------------------
输出结果:
局部变量的地址local_a:00000045BEB5F9E4
局部变量的地址local_b:00000045BEB5FA04
//可以看出全局变量的地址与局部变量的地址不在一片内存空间
全局变量的地址global_a:00007FF74F00D000
全局变量的地址global_b:00007FF74F00D004

1-2-2, 静态变量

通过static 数据类型  变量名方式定义的变量为静态变量

#include <iostream>
#include <string>using namespace std;/*静态变量存放在全局区,程序运行结束后由操作系统释放*/int global_a = 10;
int global_b = 10;int main()
{//定义静态变量static int local_static_a = 10;static int local_static_b = 20;cout << "全局变量的地址global_a:" << & global_a << endl;cout << "全局变量的地址global_b:" << &global_b << endl;cout << "静态变量的地址local_static_a:" << &local_static_a << endl;cout << "静态变量的地址local_static_b:" << &local_static_b << endl;system("pause");return 0;
}
-----------------------------------------------------
输出结果:
//可以看出全局和静态变量存放在同一块内存区中
全局变量的地址global_a:00007FF60391D074
全局变量的地址global_b:00007FF60391D078
静态变量的地址local_static_a:00007FF60391D07C
静态变量的地址local_static_b:00007FF60391D080

1-2-3, 全局常量

在函数体外通过const 数据类型 变量名, 可定义一个全局常量

#include <iostream>
#include <string>using namespace std;/*全局常量,字符串常量存放在全局区,程序运行结束后由操作系统释放*/int global_a = 10;
int global_b = 10;//定义全局常量
const int c_global_a = 10;
const int c_global_b = 10;int main()
{//定义局部常量const int local_a = 10;const int local_b = 20;cout << "全局变量的地址global_a:" << & global_a << endl;cout << "全局变量的地址global_b:" << &global_b << endl;cout << "全局常量的地址c_global_c:" << &c_global_a << endl;cout << "全局常量的地址c_global_d:" << &c_global_b << endl;//&"aaaaa"表示获取该字符串常量的地址cout << "字符串常量的地址:" << &"aaaaa" << endl;cout << "局部常量的地址:" << &local_a << endl;cout << "局部常量的地址:" << &local_b << endl;system("pause");return 0;
}
----------------------------------------------------------------
输出结果:
//可以看出, 全局变量, 全局常量在同一块内存空间
全局变量的地址global_a:00007FF60F63D074
全局变量的地址global_b:00007FF60F63D078
全局常量的地址c_global_c:00007FF60F63ABB0
全局常量的地址c_global_d:00007FF60F63ABB4
字符串常量的地址:00007FF60F63ACA8
//可以看出局部常量与上面的常量不在一块内存空间
局部常量的地址:0000004A3B11F634
局部常量的地址:0000004A3B11F654

1-3, 栈区

栈区存放的是C++代码的函数的参数, 局部变量, 由编译器自动分配和释放。

注意:不要放回局部变量的地址, 因为局部变量在函数调用完后, 就被编译器释放。 

#include <iostream>
#include <string>using namespace std;/*局部变量和形参都是存放在栈区,由编译器分配和释放*/
int * func(int b)
{int a = 10;return &a;
}int main()
{int* p = func();cout << "调用func:" << *p << endl;system("pause");return 0;
}
---------------------------------------------------
输出结果:
//因为局部变量调用完后, 就被释放了, 所以这里没有获取到局部变量a的值
//同理形参b也一样
第一次调用func:-858993460

1-4, 堆区

堆区是由程序员分配和释放的, 若程序员不主动释放,在程序结束后由操作系统释放

1-4-1, new单个对象

通过new 数据类型(对象), 可在堆区创建一个地址,对象为地址指向的值, 返回指定数据类型的指针

#include <iostream>
#include <string>using namespace std;/*堆区的数据是由程序员分配的,若不主动释放,在程序
运行完成后, 由操作系统释放*/int * func()
{//通过new方式在堆区创建一块地址,返回对应数据类型的指针//地址存的数据是10//局部变量p,任然在栈区int* p = new int(10);return p;
}int main()
{int* p = func();cout << "调用func:" << *p << endl;cout << "调用func:" << *p << endl;system("pause");return 0;
}
-----------------------------------------------------
//能打印出10, 是因为10是存放在堆区上, 不会因为func调用完成后而释放
调用func:10
调用func:10

1-4-2, delete单个对象

通过delete 指针可手动释放堆区指定的内存空间

#include <iostream>
#include <string>using namespace std;/*堆区的数据是由程序员分配的,若不主动释放,在程序
运行完成后, 由操作系统释放*/int * func()
{//通过new方式在堆区创建一块地址,地址存的数据是10//局部变量p,任然在栈区int* p = new int(1011);return p;
}int main()
{int* p = func();cout << "调用func:" << *p << endl;//通过delete手动释放堆区的地址delete p;//该行调用,会报错,因为p指向的值已经被释放cout << "调用func:" << *p << endl;system("pause");return 0;
}
-----------------------------------------------------------
输出结果:
调用func:1011
//这里没有输出的因为是因为p已经被手动释放
调用func:

1-4-3, new&delete数组

通过new 数据类型[长度], 可在堆区创建一块数组地址空间, 同delete[] 指针, 手动释放创建的地址空间

#include <iostream>
#include <string>using namespace std;int * func()
{//表示在堆区中创建一个大小为10数组地址空间, 并赋值给指针arrint* arr = new int[10];//数组赋值for (int i = 0; i < 10; i++){arr[i] = i;}return arr;
}int main()
{int* arr = func();//逐个打印数组元素for (int i = 0; i < 10; i++){cout << arr[i] << " ";}cout << endl;//delete[]表示释放的是一个数组地址空间delete[] arr;system("pause");return 0;
}
-------------------------------------------------------------------
输出结果:
0 1 2 3 4 5 6 7 8 9

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

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

相关文章

【ROS系列】坐标系转换介绍和对齐

一、坐标系简介 本篇文章介绍&#xff1a;ECEF、ENU、UTM、WGS-84坐标系&#xff08;LLA) 1.1、ECEF坐标系 ECEF坐标系也叫地心地固直角坐标系。 原点&#xff1a;地球的质心&#xff0c; x轴&#xff1a;原点延伸通过本初子午线&#xff08;0度经度&#xff09;和赤道&am…

Fabric二进制建链(客户端与节点主机分离)

目录 一、客户端准备1.1、准备链目录和配置文件1.2、设置环境变量1.3、初始化和启动fabric-ca-server1.4、登记ca的admin用户 二、准备组织org12.1、准备组织目录2.2、生成组织org1的msp配置 三、准备peer0节点3.1、注册peer03.2、注册peer组织org1的user3.3、注册peer组织org1…

macOS 创建Flutter项目

参考在 macOS 上安装和配置 Flutter 开发环境 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 这个文档&#xff0c;配置好flutter的环境 编辑器可以选择vscode或者IDEA。 我这里以IDEA为例 打开 IDE 并选中 New Flutter Project。 选择 Flutter&#xff0c;验证 F…

python企业微信小程序发送信息

python企业微信小程序发送信息 在使用下面代码之前先配置webhook 教程如下&#xff1a; https://www.bilibili.com/video/BV1oH4y1S7pN/?vd_sourcebee29ac3f59b719e046019f637738769 然后使用如下代码就可以发消息了&#xff1a; 代码如下&#xff1a; #codinggbk import r…

嵌入式Linux系统的闪存设备和文件系统学习纪要

嵌入式Linux系统的闪存设备和文件系统学习纪要 Linux下的文件系统结构如下&#xff1a; NAND Flash 是一种非易失性存储器&#xff08;Non-Volatile Memory&#xff09;&#xff0c;常用于闪存设备和固态硬盘&#xff08;SSD&#xff09;中。以下是几种常见的 NAND Flash 种类&…

中期科技:智慧公厕打造智能化城市设施,提升公共厕所管理与服务体验

智慧公厕是利用先进的技术和创新的解决方案来改进公厕的设施和管理。借助物联网、互联网、5G/4G通信、人工智能、大数据、云计算等新兴技术的集成&#xff0c;智慧公厕具备了一系列令人惊叹的应用功能。从监测公厕内部人体活动状态、人体存在状态&#xff0c;到空气质量情况、环…

【k8s】pod集群调度

调度约束 Kubernetes 是通过 List-Watch **** 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 Pod 和 Container。…

Go语言并发控制:原理与实践

摘要&#xff1a; 本文将深入探讨Go语言的并发控制机制&#xff0c;包括goroutine、channel和sync等关键概念。我们将通过理论阐述和案例分析&#xff0c;揭示Go语言在并发编程中的优势和挑战&#xff0c;并介绍几种常见的并发控制策略。通过本文的学习&#xff0c;你将掌握Go…

注册中心ZK、nameServer、eureka、Nacos介绍与对比

前言 注册中心的由来 微服务架构是存在着很多跨服务调用,每个服务都存在着多个节点,如果有多个提供者和消费者,当提供者增加/减少或者消费者增加/减少,双方都需要感知发现。所以诞生了注册中心这个中间件。 市面上有很多注册中心,如 Zookeeper、NameServer、Eureka、Na…

log4j 日志的简单使用

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 前言 System.out.println("这是我的测…

2023年云栖大会来啦!!(2022年就已经深受震撼)

2023云栖大会已经开始啦&#xff0c;让我们来回顾回顾去年的云栖大会吧。 云栖大会是中国阿里巴巴集团每年举办的一项技术盛会&#xff0c;前身可追溯到2009年的地方网站峰会&#xff0c;2011年演变为阿里云开发者大会&#xff0c;2015年正式更名为“云栖大会”&#xff0c;并且…

暴涨3倍!通过受感染 USB 窃密的事件愈发变多

2023 年上半年&#xff0c;Mandiant 观察到使用受感染 USB 驱动器窃取机密数据的事件至少增加了3倍。此前&#xff0c;Mandiant 披露了在菲律宾的一次攻击行动。本文将会介绍研究人员发现的两外两次基于 USB 驱动器的网络间谍行动。 CSDN大礼包&#xff1a;《黑客&网络安全…

【Verilog】7.2.1 Verilog 并行 FIR 滤波器设计

FIR&#xff08;Finite Impulse Response&#xff09;滤波器是一种有限长单位冲激响应滤波器&#xff0c;又称为非递归型滤波器。 FIR 滤波器具有严格的线性相频特性&#xff0c;同时其单位响应是有限长的&#xff0c;因而是稳定的系统&#xff0c;在数字通信、图像处理等领域…

Flutter框架实现登录注册功能,不连接数据库

要在Flutter框架中实现登录和注册功能&#xff0c;而不连接数据库&#xff0c;可以使用本地存储来存储用户信息。以下是一个简单的示例&#xff0c;演示如何使用本地存储来实现登录和注册功能。 首先&#xff0c;我们需要添加 shared_preferences 插件到 pubspec.yaml 文件中&…

nginx 转发数据流文件

1.问题描述 后端服务&#xff0c;从数据库中查询日志&#xff0c;并生成表格文件返回静态文件。当数据量几兆时&#xff0c;返回正常&#xff0c;但是超过几十兆&#xff0c;几百兆&#xff0c;就会超过网关的连接超时时间30秒。 时序图 这里面主要花费时间的地方在&#xff…

从零开始的目标检测和关键点检测(二):训练一个Glue的RTMDet模型

从零开始的目标检测和关键点检测&#xff08;二&#xff09;&#xff1a;训练一个Glue的RTMDet模型 一、config文件解读二、开始训练三、数据集分析四、ncnn部署 从零开始的目标检测和关键点检测&#xff08;一&#xff09;&#xff1a;用labelme标注数据集 从零开始的目标检测…

领先实践|IDEO 最佳设计思维和策略框架

设计思维是一种以人为本的创新方法&#xff0c;它从人类的角度出发&#xff0c;考虑技术上可行和经济上可行的内容。框架可以成为实现设计思维、策略和系统设计的有用工具。本文由此展开阐述 IDEO 的最佳设计思维和策略框架。 01. 设计思维框架 1.1 设计思维过程 设计思维?是…

python3 阿里云api进行巡检发送邮件

python3 脚本爬取阿里云进行巡检 不确定pip能不能安装上&#xff0c;使用时候可以百度一下&#xff0c;脚本是可以使用的&#xff0c;没有问题的 太长时间了&#xff0c;pip安装依赖忘记那些了&#xff0c;使用科大星火询问了下&#xff0c;给了下面的&#xff0c;看看能不能使…

一行代码搞定禁用web开发者工具

在如今的互联网时代&#xff0c;网页源码的保护显得尤为重要&#xff0c;特别是前端代码&#xff0c;几乎就是明文展示&#xff0c;很容易造成源码泄露&#xff0c;黑客和恶意用户往往会利用浏览器的开发者工具来窃取网站的敏感信息。为了有效防止用户打开浏览器的Web开发者工具…

X64(64位)汇编指令与机器码转换原理

X64&#xff08;64位&#xff09;汇编指令与机器码转换原理 1 64位寻址形式下的ModR/M字节1.1 寻址方式1.2 寄存器编号 2 汇编指令转机器码2.1 mov rcx, 1122334455667788h2.2 mov rcx,[r8]与mov [r8],rcx2.3 mov rcx,[r8r9*2] 本文属于《 X86指令基础系列教程》之一&#xff…