C++——内存分区

2023-11-05

内存分区


四大分区

  • 代码区:二进制代码,操作系统管理
  • 全局区:全局变量、静态变量、常量
  • 栈区:编译器自动分配释放,函数的参数值,局部变量等
  • 堆区:手动分配释放,程序结束时未释放的将由操作系统回收

不同的区赋予了不同数据不同的生命周期,实现灵活编程

编译后运行前

程序编译后生成exe、bat、out等可执行文件,在运行程序前,内存分为两部分:

  • 代码区:存放待执行的机器指令,其为共享只读
  • 全局区:全局变量、静态变量、const修饰的全局常量、字符串常量。该区域数据由程序结束后操作系统释放
    ps:函数体内的变量都是局部变量
    在这里插入图片描述

程序运行后


栈区

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

ps:不要返回局部变量地址,因为其由编译器自动释放

int* function(int b) {
	int a = 1;
	return &a;
}
int main() {
	int c = 3;
	int* p = function(c);
	cout << *p << endl;
	cout << *p << endl;
}

在这里插入图片描述


int* function(int b) {
	int a = 1;
	return &b;
}
int main() {
	int c = 3;
	int* p = function(c);
	cout << *p << endl;
	cout << *p << endl;
}

在这里插入图片描述
··可以看出上面两个例子的区别,分别是函数function的局部变量和形参,编译器自动分配和释放,对于形参b函数执行结束立刻就回收释放,对于局部变量a进行了一次保留,因此尽量不要返回局部变量的地址

堆区

程序员手动分配和释放,若不释放,则程序运行结束时由操作系统回收,常用**new**开辟
<br>

1 new使用

new 数据类型()返回该类型的指针

int* function(){
	int* p = new int(10);
	return p;
}

int main(){
	int* p1 = function();
	cout<<*p1<<endl;
	cout<<*p1<<endl;
}
-------------------------------
10
10

可以看出上述的function函数内部用new在堆区开辟了空间,其由程序员手动控制释放,因此p指针在程序结束后保留一次将地址的值返回给p1,p1指向了堆区的数据,p由编译器回收后,p1仍然指向堆区,因此一直会是10的输出

2 释放空间

delete释放空间

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

报错:p已经释放,再次解引用*p会报错

3 new 数组

int* arr = new int[10] //10是是个数组,返回首地址
for (int i = 0;i<10;i++){
	arr[i] = i+100;
} //赋值100到109

// 释放数组
delete[] arr; //加上[]表示数组
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++——内存分区 的相关文章

  • 如何管理返回到 QML 的动态分配的 QObject 的生命周期?

    我有这个代码 QVariant componentFromCode QString code QQmlComponent component new QQmlComponent engine engine gt setObjectOwner
  • 这个洗牌算法有什么问题吗?

    我一直在做一些休闲假期计算 我的迷你项目是模拟意大利游戏 tomboli 一个关键的组成部分是对以下过程的模拟 游戏由一名男子控制 他拿着一袋 90 个弹珠 编号为 1 到 90 他从袋中随机取出一颗弹珠 每次向玩家喊出弹珠编号 经过一番思
  • 如何使构造函数只能由基类访问?

    如果我想要一个只能从子类访问的构造函数 我可以使用protected构造函数中的关键字 现在我想要相反的 我的子类应该有一个构造函数 该构造函数可以由其基类访问 但不能从任何其他类访问 这可能吗 这是我当前的代码 问题是子类有一个公共构造函
  • 相当于一个允许重复键的排序字典

    我需要一个数据结构 可以通过与对象关联的浮动键对对象进行排序 从低到低的在前 问题是键代表成本 所以经常有重复 我不关心这一点 因为如果两个具有相同的成本 我只会抓住第一个 因为它没有区别 问题是编译器抱怨 是否有一种数据结构的行为方式相同
  • ASP.NET Core 测试 - 没有方法 'public static IHostBuilder CreateHostBuilder(string[] args)

    我正在尝试在测试中设置我的应用程序并在中使用Startup s Configure method context Database EnsureCreated 并期待着Sqlite文件出现在Test sbin文件夹 这是我的代码 using
  • “上下文模式”的这种实现看起来不错吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有多个处理单元可能存在于一个数组中 每个处理单元都有自己的参数 我想使用以下方式传达每个处理单元的参数上下文模式在它被建议作为另一个问题的解答 ht
  • 如何获取字符串宽度

    我需要在类库中构建一个函数 该函数接受一个字符串和该字符串的特定字体 然后获取字符串的宽度 那么我怎样才能得到字符串边界宽度呢 另一种方法是使用TextRenderer 并致电its MeasureString http msdn micr
  • Python NET 调用具有返回值和输出参数的 C# 方法

    我有以下静态 C 方法 public static bool TryParse string s out double result 我想使用 Python NET 包从 Python 调用它 import clr from System
  • 从网站保存嵌入的 pdf

    我正在编写一个小型 C 应用程序来管理供应商提供的 化学品 安全数据表 目前 我手动搜索该化学品并保存 pdf 并在我的程序中添加指向 pdf 的链接 问题是我还有很多化学品需要处理 所以最好将过程自动化 例如 化学品的部件号如下 2710
  • 我应该在查询时调用 ToListAsync()

    不久前 我开始接触 C 并正在寻找一些如何编写代码的最佳实践 现在 我正在使用 EF Core 并具有以下代码 var details dbContext Details Where x gt x Name Button foreach v
  • 策略模式的现实示例

    我一直在读关于OCP原理 http en wikipedia org wiki Open closed principle以及如何使用策略模式来实现这一目标 我打算尝试向几个人解释这一点 但我能想到的唯一例子是根据 订单 的状态使用不同的验
  • 您在 C# 或 .NET 中见过的最奇怪的极端情况是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 C 中初始化结构体的静态数组

    我正在用 C 实现一个纸牌游戏 纸牌有很多种类型 每种纸牌都有大量信息 包括一些需要单独编写与其关联的脚本的操作 给定这样的结构 并且我不确定我的语法是否适合函数指针 struct CARD int value int cost This
  • 如何使用实体框架更新特定记录的一个字段?

    我想要更新一个名叫 Pejman 的人的家庭情况 这是我的对象类 public class Person public int Id get set public string FirstName get set public string
  • ASP.NET 5 (vNext) - 配置

    我正在尝试学习 ASP NET 5 我在 Mac OS X 上使用它 此时 我有一个如下所示的 config json 文件 配置 json AppSettings Environment dev DbSettings AppConnect
  • 为什么这些双精度数的返回值为-1.#IND?

    I have double score cvMatchContourTrees CT1 CT2 CV CONTOUR TREES MATCH I1 0 0 cout lt
  • C++ 中的 Ofstream 数组

    我想要在我的项目中使用 41 个输出文件来在其上写入文本 首先创建一个字符串数组list为了命名这些输出文件 然后我尝试定义一个 ofstream 对象数组并使用list命名它们 但我收到此错误 outfile cannot be used
  • 如何检查多个变量是否等于同一值?

    如何比较多个项目 例如 我希望检查所有变量 A B 和 C 是否都等于字符 X 或所有三个变量都等于 O 如果其中 2 个为 X 1 个为 O 则应返回 false I tried if A B C X A B C O Do whateve
  • 如何注销多个非当前用户的会员用户?

    我正在使用属于 MVC2 默认项目一部分的 MembershipProvider 我希望能够获取用户名列表 注销用户 并在需要时销毁他们的会话 我能想到的最接近的是 foreach string userName in UserNames
  • C# 泛型中的通配符等效项

    假设我有一个通用类 如下所示 public class GeneralPropertyMap

随机推荐

  • 分布式训练——集合通信及其通信原语

    分布式训练 集合通信及其通信原语 转自 分布式训练 第3篇 集合通信及其通信原语 作者 常平 1 概述 集合通信 Collective Communications 是一个进程组的所有进程都参与的全局通信操作 其最为基础的操作有 发送sen
  • EHCI控制器(3)——host模式数据传输模型

    3 host模式数据传输模型 3 1控制传输 3 1 1配置通道特性 3 1 2配置通道0 包数量 3 1 3配置通道0 PID 3 1 4配置DMA描述符 3 1 5更新DMA描述符地址 3 1 6清通道0中断状态 3 1 7使能通道0
  • java代码_阿里Java团队的的代码规范,学到很多

    一 迭代entrySet 获取Map 的key 和value 当循环中只需要获取Map 的主键key时 迭代keySet 是正确的 但是 当需要主键key 和取值value 时 迭代entrySet 才是更高效的做法 其比先迭代keySet
  • mysql 本周函数_MySQL的YEARWEEK函数以及查询本周数据(转)

    MySQL的YEARWEEK函数以及查询本周数据 MySQL 的 YEARWEEK 是获取年份和周数的一个函数 函数形式为 YEARWEEK date mode 例如 2010 3 14 礼拜天 SELECT YEARWEEK 2010 3
  • Oracle+jdbc+rac+url,jdbc连接oracle rac数据库的写法

    RAC是real application clusters的缩写 译为 实时应用集群 是Oracle新版数据库中采用的一项新技术 是高可用性的一种 也是Oracle数据库支持网格计算环境的核心技术 jdbc连接oracle rac数据库的写
  • JDBC与PostgreSQL(二)

    目录 一 执行DDL语句 二 执行DML语句 三 执行DQL语句 四 使用预编译的方式执行SQL语句 推荐 一 执行DDL语句 SQL的DDL语句也就是数据定义语言 Data Definition Language 在JDBC中需要获取St
  • linux下U盘和SD卡的热拔插检测

    在Linux中 可以使用udev Linux设备管理器 来检测U盘的插入和拔出事件 udev是一个用于管理和监控设备的子系统 它可以通过监视内核事件来触发相应的操作 创建一个udev规则文件 10 usb rules脚本如下 KERNEL
  • 开源水下机器人之推进器使用教程

    主要还是参考官方原文 点击打开链接 首先看看套件外观 中规中矩 比较简单 器件材料
  • 安装laravel 遇到的一个坑

    在安装php spider之前必须安装Composer 安装Composer之后 通过php spider的说明文档进行安装 出现以下错误 Failed to download vdb uri from source The Process
  • JS逆向 数据类型/常用加密之小白入门基础篇一

    JS逆向 数据类型 常用加密之小白入门基础篇一 文章目录 JS逆向 数据类型 常用加密之小白入门基础篇一 TOC 文章目录 前言 一 JavaScript 基础常识 语法基础 1 1基本数据类型 1 2 引用数据类型 1 3 语句标识符 2
  • 《武术与设计模式》创建型

    本人喜欢武术 故写下此篇 权当消遣 仅供参考 创建型 原意 创建对象的模式 单例 程序 一个对象就存在一个 武林 所谓 武林至尊 宝刀屠龙 号令天下 莫敢不从 匠人在打造屠龙宝刀时 决定打造一件世间仅此一件的宝物 简单工厂 程序 某种类型指
  • 【数据库】MySQL中的锁机制

    MySQL中的锁机制 数据库锁定机制简单来说 就是数据库为了保证数据的一致性 而使各种共享资源在被并发访问变得有序所设计的一种规则 MySQL 数据库由于其自身架构的特点 存在多种数据存储引擎 每种存储引擎的锁定机制都是为各自所面对的特定场
  • 在树莓派linux系统下写c程序

    本文主要介绍如何在树莓派 ubuntu mate系统 下写第一个c程序 两种方式 一是emacs 二是vi 一 用emacs写c程序 1 打开终端 输入 emacs hello em world c 如果你还没有安装 会出现以下提示 如图
  • 关于解决多台服务器间的文件实时同步问题

    最近要做一个相关的解决方案 在虚拟机测试没有问题 给大家分享出来 有更好的解决方案 欢迎讨论 1 1 inotify相关介绍 1 rsync 与传统的cp tar备份方式相比 rsync具有安全性高 备份迅速 支持增量备份等优点 通过rsy
  • java NIO

    概述 NIO主要有三大核心部分 Channel 通道 Buffer 缓冲区 Selector 选择器 NIO 与 IO的区别 IO是面向流的 NIO是面向缓冲区的 Java IO面向流意味着每次从流中读一个或多个字节 直至读取所有字节 它们
  • 晦涩难懂的电路反馈,看完终于懂了!

    一 反馈的基本概念 1 1 什么是反馈 反馈 就是把放大电路的输出量的一部分或全部 通过反馈网络以一定的方式又引回到放大电路的输入回路中去 以影响电路的输入信号作用的过程 1 2 放大电路中引入反馈的作用 放大电路静态工作点会随温度的变化而
  • GDI+ Graphics类

    1 GDI 的核心 Graphics类 1 The Graphics class provides methods for drawing lines curves figures images and text A Graphics ob
  • 操作系统期末复习总结

    操作系统期末复习总结 第一章 操作系统引论 1 1操作系统的目标和作用 1 1 1操作系统的目标 在计算机系统上配置操作系统 其主要目标是 方便性 有效性 可扩充性和开放性 方便性 配置OS后方便使用 有效性 提高系统资源的利用率 可扩充性
  • 西门子S7-1200PLC脉冲控制伺服程序案例

    西门子S7 1200PLC脉冲控制伺服程序案例 此程序是关于西门子1200PLC以PTO脉冲方式控制伺服电机 步进电机的功能块程序 包含两套程序 第一套程序是用梯形图写的 第二套程序是用SCL高级编程语言写的 两套程序实现的功能一致 脉冲模
  • C++——内存分区

    内存分区模型 内存分区 四大分区 编译后运行前 程序运行后 栈区 堆区 1 new使用 2 释放空间 3 new 数组 内存分区 四大分区 代码区 二进制代码 操作系统管理 全局区 全局变量 静态变量 常量 栈区 编译器自动分配释放 函数的