C/C++之内存四区

2023-11-18

程序运行时,将内存大致分为四个区域

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

内存四区的意义:

不同区域存放的数据,赋予不同生命周期,使我们可以灵活编程。

程序编译后,未执行该程序前分为两个区域

代码区

存放CPU执行的机器指令;
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可;
代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令。

全局区

全局变量和静态变量存放在此;
全局区还包含了 常量区字符串常量和其他常量也存放在此;
该区域的数据在程序结束后由操作系统释放。

栈区

由编译器自动分配释放,存放函数的参数值,局部变量等。
注意事项:不要返回局部变量的地址,栈区开辟的地址由编译器自动释放。

堆区

由程序员分配释放,若程序员不释放,程序结束时由操作系统回收;
在C++中主要利用new关键字开辟堆区。

这里看一个程序

#include<iostream>
using namespace std;
int* func1()
{
    int a = 10;    //局部变量,存放在栈区,栈区的数据在函数执行完后自动释放
    return &a;    //返回局部变量地址
}
int* func2()
{
    int* a = new int(10);    //局部变量,存放在栈区,栈区的数据在函数执行完后自动释放
    return a;    //返回局部变量地址
}
void test1()
{
    int* p1 = test1();
    cout << *p1 << endl;
    cout << *p1 << endl;
}
void test2()
{
    int* p2 = test2();
    cout << *p2 << endl;
    cout << *p2 << endl;
    delete p2;
}
int main()
{
    test1();
    test2();
    return 0;
}

这里我们发现test1()的第一个cout可以输出,第二个就是乱码了,为什么??难道不应该是两个都是乱码,因为局部变量在栈区,生命周期是test1()内部,但是这里将p2的地址返回了,所谓的释放内存,并不是把栈上对应的内存的数据清空了,而是程序失去了对栈所在内存的控制权。所以编译器在函数返回时防止用户操作错误,保留了一次,但第二次时就乱码了;而test2()是new出来的,在堆区开辟,则不存在栈区的问题。

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

C/C++之内存四区 的相关文章

  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • vue3_父子组件传参

    最近在看b站 小满zs 的vue3教程 巩固一下 1 父 gt 子组件 父组件自定义一个属性 用v bind 绑定在子组件上
  • couldn't find native method

    有两个原因 1 java这边native方法没有 native void renderFrameStart 2 c这边没有实现native方法 12 29 15 52 27 901 32735 32735 com ffmpegtest E
  • vue模板语法(上)

    目录 一 插值 什么是插值 建立一个html来编写插值 输出结果 二 指令 什么是指令 建立一个html来编写指令 输出结果 编辑 动态参数 输出结果 三 过滤器 什么是过滤器 建立一个html来编写过滤器 输出结果 4 计算属性 监听属性
  • STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口

    STM32F103C8T6驱动舵机SG90 配置定时器TIM2 TIM3 TIM4的多种重映射模式下的不同IO口 1 使用到的工具介绍 2 整个简单介绍 3 程序的介绍 1 使用到的工具介绍 keil5 烧写软件FlyMcu exe 硬件为
  • CS143-project2 局部特征匹配 Local Feature Matching

    本项目通过harris算法对图像进行兴趣点的检测和提取 然后计算兴趣点周围4 4区域的8个方向特征向量 最后对获取到的特征向量对进行匹配 本算法对旋转 缩放 亮度变化保持一定程度的稳定性 环境 操作系统 WIN7 实现平台 MATLAB20
  • Flask 项目部署(Docker + Flask + uwsgi + Nginx)

    文章目录 一 项目背景 二 项目部署 2 1 项目基础环境 2 2 获得 Python 环境的所需依赖 2 3 配置 gunicorn 2 4 编写 Dockerfile 2 5 编写 docker compose 选用 2 6 Docke
  • CS224W 第一讲 图论基本知识回顾

    网络的组成 一个网络由 对象 关系 系统 组成 网络的表示 有向图和无向图 节点的度 这里平均度数分别为 2E N 和 E N 同时 有向图有一个很重要的概念就是 所有的出度和入度是相同的 完全图 clique or Complete gr
  • 前端传递base64编码,java后端接收,并转为MultipartFile对象

    前端传递的base64 通过url Base64中的 和 字符变为形如 XX 的形式 所以后端接收的字符串是带 的 所以需要解码 String decode URLDecoder decode avatar 下面是工具类 base64转为m
  • 3DMax 卡死、白屏、渲染死机问题总结

    白屏 3dmax出现白屏解决方法 以下是ChatGPT给出的答案 内存不足 3DsMax需要大量的内存才能正常运行 如果你的计算机内存不足 3DsMax就会卡死 解决办法是升级你的计算机内存或者关闭一些不必要的程序来释放内存 显卡驱动过时
  • C++之tuple

    2023年6月4日 周日下午 今天下午简单学习了一下tuple 现在来简单介绍一下tuple 功能 生成一个含不同数据类型的元素列 创建 可以通过声明或make tuple来创建tuple include
  • 在Qt中,如何布局,让控件显示在自己想要的位置

    想到一个办法 可以使用QGridLayout 使用空的QLabel填充空白位置 空的QLabel是透明的 所以看起来就是被填充区域为空白 可以让自己想要显示的控件显示在右上方或者左下方或者任何想要显示的地方 绿色为填充的空QLabel 如图
  • 网课重学宣言:御风计划

    当前状态 我报了网课 2023年4月份报的花了1w3 现在是快7月份了 但是我没学多少 这一份课程的学习困难重重 如今我面临两个选择 一个是放弃这么课 跟着流程继续学习 能学一点是一点 然后把其他精力放在别的方面 另一个是重新延期学习 重新
  • Qt下监测内存泄漏

    在写Qt应用程序时 由于是采用C 语言 经常会碰到一个令人棘手的问题 那就是内存泄漏 虽然后面C 为了防止内存泄漏 发布了智能指针以用来避免内存泄漏 但是并不能完全避免 而且智能指针使用不当 同样会造成非常严重的问题 这里智能指针就不在赘述
  • 项目在was 7.0上部署问题解决方案

    年前 在做项目的时候 遇到客户要求应用服务器采用WebSphere服务器 之前从来没有接触过该类服务器 所以项目在架构部署上遇到了很多问题 现在给自己做个笔记 记录一下在websphere应用上遇到的问题 为以后做参考 同时 给有遇到此问题
  • 谈GPT-2(附大量网址)

    文章目录 前言 关于GPT 2 各个版本的GTP 2 中文版GTP 2 语料链接 15亿参数版GPT 2 OpenGPT 2 前言 GPT 2这个名字不知有多少人知道 但有很多人应该都知道埃隆 马斯克的OpenAI吧 OpenAI 由诸多硅
  • Python时间模块之calendar模块

    目录 简介 calendar month isleap calendar leapdays monthcalendar monthrange timegm 总结 简介 在项目开发中做功能经常会用到关于时间的操作 比如会员过期的定时任务 一些
  • 计算机视觉需要学什么?CV知识点

    最近有人问计算机视觉需要学什么 我自己本身是通过自学然后找到了计算机视觉相关的工作 这里我分享一下自己的当初掌握的知识点 希望能帮助到你 以下内容仅供参考 计算机视觉需要学什么 学习计算机视觉需要具备的知识储备有 1 图像处理的知识 图像处
  • 记录一次rabbitmq ConfirmCallback不生效的问题

    记录一次rabbitmq回调函数不生效的问题 application yml里是否存在 springboot版本的问题 改为2 1 7 RELEASE即可 以上都未生效的话 检查一下是否自己写了连接rabbitmq的bean 在里面加上下面
  • Unity 3D中的帧动画播放

    帧动画 Frame By Frame 的原理 链接 项目实例资源 关键是连续的关键帧分解动作 也就是在时间轴的每帧上逐帧绘制不同的内容 使其连续播放而成动画 虽然每一帧都不一样 处理的信息量大 但是 帧动画具有非常大的灵活性 几乎可以表现任
  • C/C++之内存四区

    程序运行时 将内存大致分为四个区域 代码区 存放函数体的二进制代码 由操作系统进行管理的 全局区 存放 全局变量和 静态变量以及 常量 栈区 由编译器自动分配释放 存放函数的参数值 局部变量等 堆区 由程序员分配和释放 若程序员不释放 程序