C++ 一些学习笔记(三) 内存区域

2023-11-19

主要是针对之前学习C的时候一些知识点的遗漏的补充,还有一些我自己觉得比较重要的地方。

本文章的主要内容是关于程序内存模型的。

内存的分区模型

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

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

1.程序运行前

程序在编译后生成了可执行程序,未执行该程序前分为两个区域:代码区和全局区

代码区:
	存放CPU执行的机器指令
	代码区是共享的,共享的目的是对于频繁执行的程序,只需在内存中有一份代码即可
	代码区是只读的,只读的原因是防止程序意外的修改了它的指令
全局区:
	全局变量和静态变量存放在此
	全局区还包含了常量区,字符串常量和其他常量也存放在这里
	//这里的常量分为:字符串常量和const修饰的变量(const修饰的全局变量在全局区、const修饰的局部变量不在);
	//带“局部”的都不在全局区 
	由操作系统回收

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

2.程序运行后

程序运行后为两个区域:栈区和堆区

栈区:
	由编译器自动分配释放,存放函数的参数值,局部变量等
	注意事项:不需要返回局部变量的地址,栈区开辟的数据由编译器自动释放 	
堆区:
	由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
	在C++中主要利用new开辟内存
	

总结:
	堆区数据由程序员管理开辟和释放
	堆区数据利用new关键字进行开辟内存
	//指针本质也是局部变量,放在栈上,指针保存的数据放在堆区

3.new操作符

在C++中利用new在堆区开辟内存
堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符delete
语法: new 数据类型
利用new创建的数据,会返回数据对应类型的指针

	//1.new的基本语法
int * func(){
	//在堆区创建整形数据
	//new返回的是该数据类型的指针
	int*p=new int(10);
	return p;
	}
void test01(){
	int*p=func();
	cout<<*p<<endl;
	//堆区的数据由管理员释放
	//如果想释放堆区的数据,使用关键字delete
	delete p;
	}
	//2.在堆区利用new开辟数组
	void test02(){
	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[] arr;//释放数组的时候要加[]
	
	} 
int main(){
	//1.new的基本语法
	test01();
	//在堆区利用new开辟数组
	test02();
}	
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 一些学习笔记(三) 内存区域 的相关文章

随机推荐

  • 一篇文章了解爬虫技术现状

    本文全面的分析了爬虫的原理 技术现状 以及目前仍面临的问题 如果你没接触过爬虫 本文很适合你 如果你是一名资深的虫师 那么文末的彩蛋你可能感兴趣 需求 万维网上有着无数的网页 包含着海量的信息 无孔不入 森罗万象 但很多时候 无论出于数据分
  • list【2】模拟实现(含迭代器实现超详解哦)

    模拟实现list 引言 实现概述 list迭代器实现 默认成员函数 operator 与 operator gt operator 与 operator operator 与 operator 迭代器实现概览 list主要接口实现 默认成员
  • pnpm修改设置下载包的存储路径

    要修改 pnpm 存储依赖的路径 可以使用 pnpm 的 store 配置选项 通过更改 store 配置 可以指定 pnpm 存储依赖的目录位置 这在希望将依赖存储在不同磁盘分区 不同的硬盘驱动器或其他自定义位置时很有用 步骤 1 打开命
  • 9.2 流程分析

    介绍了系统文件加密和文件解密的流程 那么我们本例主要涉及两个核心函数个函数Encrypt File和Decrypt File 使用Encrypt File函数完成文件加密功能 Decrypt File函数完成文件解密功能 下面介绍这两个函数
  • 跟着官网编写一个LLVMPass

    官网地址 https llvm org docs WritingAnLLVMPass html introduction what is a pass 一 创建文件 1 项目结构为 llvm project lib Transforms H
  • TscanCode C/C++静态分析开源分析工具安装与使用

    TscanCode是腾讯静态分析团队开发的一款开源免费的C C 静态分析工具 由于其比较简单实用 准确率较高 并且扫描C C 代码不需要进行编译 所以个人觉得对C C 项目开发挺有帮助的 就简单介绍一下该工具的安装与使用 1 Tscanco
  • 文件包含漏洞-日志注入

    文件目录 一 文件包含漏洞 1 文件包含概述 2 文件包含类型 二 文件包含 日志注入 1 日志注入概述 2 环境准备 3 配置环境 4 模拟网站环境 三 日志注入流程 一 文件包含漏洞 1 文件包含概述 文件包含漏洞是 Web 应用程序中
  • springboot的优化

    在SpringBoot的Web项目中 默认采用的是内置Tomcat 当然也可以配置支持内置的jetty 内置有什么好处呢 在SpringBoot的Web项目中 默认采用的是内置Tomcat 当然也可以配置支持内置的jetty 内置有什么好处
  • 互联网JAVA面试常问问题(三)

    一 volatile原理和使用场景 volatile 原理 volatile变量进行写操作时 JVM会向处理器发送一条Lock前缀的指令 将这个变量所在缓存行的数据写会到系统内存 Lock前缀指令实际上相当于一个内存屏障 也成内存栅栏 它确
  • LED用DMX512协议整个系统怎么连接?

    提问1 EIA485规范只支持 雏菊链 或每段上最多以32个 单元负载 所构成的串行网络 DMX512不是可以支持512个通道吗 那是不是说 超过32个的情况下需要使用中继 提问2 控制器 接收端1 接收端2 接收端n 电阻 GND 这样的
  • BIO、NIO、AIO理解

    一 到底什么是BIO NIO AIO 这些可以理解为是Java语言对操作系统的各种IO模型的封装 程序员在使用这些API的时候 不需要关系操作系统层面的知识 也不需要根据不同操作系统编写不同的代码 只需要使用Java的API就可以了 二 B
  • Eclipse搭建stm32+jlink开发环境全攻略(进阶篇一)

    Eclipse搭建stm32 jlink开发环境全攻略 进阶篇 一 本篇开始讲解一些比较实用的东西 在前面的两章中 我们讲解了eclipse开发stm32的大部分问题 然而 在实际使用过程中 我们仍然会遇到一些不太理想的地方 比如 ecli
  • Leetcode力扣题解 - 30.串联所有单词的子串

    地址 30 串联所有单词的子串 力扣 LeetCode 一 思路 本题关键点是 1 所有关键词长度一致 2 匹配的是所有关键词连接起来的 大体思路 那么我们就可以从字符串头开始 每次只匹配关键词总长度个字符 如果匹配成功 在返回的数组中保存
  • HDMI中的视频时序分析

    一 前言 建立层次观念 说到时序 我们首先想到的例子是IIC SPI 串口等接口的例子 以我们之前的理解 时序就是传输线上电平随时间变化的顺序 但是但是但是 在HDMI这里 我们应该建立一个新的观念 即时序不一定对应到物理层 即传输线上 这
  • python--- end=“ , 单独的一行print()是什么意思

    有如下一道练习题 编写代码打印出下列图形 代码如下 for i in range 4 for j in range 5 print end print 其中end 意思是为末尾end传递一个空字符串 这样print函数不会在字符串末尾添加一
  • 工频干扰频谱测量_【鼎阳硬件智库译文

    英文原文 by Mratin Miller 汪进进 译 鼎阳硬件设计与测试智库发起人之一 简介 多通道串行数据链路容易受到串扰的影响 这些串扰可能来自于相邻通道 也可能是外部的干扰源 Aggressor 其结果是增加了受干扰通道 Victi
  • leetcode数组刷题总结与分析

    文章目录 小结 数组中元素的计算 子序列 任意元素 题目一 两数之和 题目15 三数的和 17 四数之和 16 最接近三数之和 167 两数之和 输入有序数组 560 和为k的子数组 523 连续的子数组的和 53 最大子数组和 713 乘
  • Shell脚本到底是什么高大上的技术吗?

    本文介绍shell脚本知识 学习前最好有linux命令知识储备 一篇文章看完 下次找工作时简历上请写上会shell脚本 栓Q shell脚本是什么 shell脚本就是一个包含shell命令的脚本 常说的linux命令 也可以认为是shell
  • ArrayList与顺序表

    目录 编辑 一 线性表 二 顺序表 1 接口的实现 1 打印顺序表 2 新增元素 3 判定是否包含某个元素 4 查找某个元素对应的位置下标 5 获取 pos 位置的元素 6 获取顺序表长度 7 给 pos 位置的元素设为 value 更新的
  • C++ 一些学习笔记(三) 内存区域

    C 一些学习笔记 三 内存区域 主要是针对之前学习C的时候一些知识点的遗漏的补充 还有一些我自己觉得比较重要的地方 本文章的主要内容是关于程序内存模型的 内存的分区模型 1 程序运行前 2 程序运行后 3 new操作符 主要是针对之前学习C