C++ 核心编程 - 内存分区模型

news2024/11/18 17:37:26

文章目录

  • 1.1 程序运行前
  • 1.2 程序运行后
  • 1.3 new 操作符

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

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

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

1.1 程序运行前

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

(1)代码区: 存放 CPU 执行的机器指令

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

  • 只读,防止程序意外地修改了它的指令。

(2)全局区: 全局变量和静态变量存放在此,在程序结束后由操作系统释放

// Global variable
int g_a = 10;
int g_b = 10;

// Global constant
const int c_g_a = 10;
const int c_g_b = 10;

int main(){
    // Local variable
    int a = 10;
    int b = 10;

    // Static vaiiable
    static int c_a = 10;
    static int c_b = 10;

    cout << "Local variable => a: " << (long)&a << endl;
    cout << "Local variable => b: " << (long)&b << endl << endl;

    cout << "Global variable => g_a: " << (long)&g_a << endl;
    cout << "Global variable => g_b: " << (long)&g_b << endl << endl;

    cout << "Static variable => c_a: " << (long)&g_a << endl;
    cout << "Static variable => c_b: " << (long)&g_b << endl << endl;

    // String constant
    cout << "String constant => str:" << (long)&"Hello" << endl << endl;

    cout << "Global constant => c_g_a: " << (long)&c_g_a << endl;
    cout << "Global constant => c_g_a: " << (long)&c_g_b << endl << endl;

    // Local constant
    const int c_l_a = 10;
    const int c_l_b = 10;

    cout << "Local constant => c_l_a: " << (long)&c_l_a << endl;
    cout << "Local constant => c_l_a: " << (long)&c_l_b << endl << endl;

    return 0;
}
Local variable => a: 140737488345656 
Local variable => b: 140737488345660

Global variable => g_a: 93824992247824 
Global variable => g_b: 93824992247828

Static variable => c_a: 93824992247824
Static variable => c_b: 93824992247828

String constant => str:93824992239796 

Global constant => c_g_a: 93824992239620 
Global constant => c_g_a: 93824992239624

Local constant => c_l_a: 140737488345664 
Local constant => c_l_a: 140737488345668

在这里插入图片描述

1.2 程序运行后

(1)栈区: 由编译器自动分配释放, 存放函数的参数值(形参),局部变量等。

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

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

int main(){
    int *p = func();

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

    return 0;
}

使用 g++ main.cpp -o main 编译时,报出如下错误:

main.cpp: In function ‘int* func()’:
main.cpp:7:12: warning: address of local variable ‘a’ returned [-Wreturn-local-addr]
    7 |     return &a;
      |            ^~
main.cpp:6:9: note: declared here
    6 |     int a = 10;
      |         ^

(2)堆区: 由程序员分配释放,若程序员不释放,程序结束时由操作系统回收。

在 C++ 中,其主要利用 new 在堆区中开辟内存。

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

int main(){
    int *p = func();

    cout << func() << endl;
    cout << *p << endl;

    return 0;
}
0x55555556aed0
10

1.3 new 操作符

​ C++ 中利用 new 操作符在堆区开辟数据,由程序员手动开辟、手动释放,释放时可利用操作符 delete

示例1:基本语法

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

int main(){
    int *p = func();

    cout << func() << endl;
    cout << *p << endl;

    delete p;
    // cout << *p << endl; // 为什么还是输出了?不应该报错吗?

    return 0;
}

示例1:开辟数组

int main(){
    int *arr = new int[10];

    for (int i = 0; i < 10; i++){
        arr[i] = i + 100;
    }

    for (int j = 0; j < 10; j++){
        cout << arr[j] << '\t';
    }

    delete[] arr;

    return 0;
}
100     101     102     103     104     105     106     107     108     109

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

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

相关文章

新媒体运营-----短视频运营-----PR视频剪辑----软件基础

新媒体运营-----短视频运营-----PR视频剪辑-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/138079659 文章目录 1.1 PR软件重置与初始化设置1.2 新建项目及序列设置1.3 PR工作区的管理方法1.4 导入4K超高清视频并与ME配合工作1…

Unity 按下Play键后,Scene View里面一切正常,但是Game View中什么都没有 -- Camera Clear Flags的设置

问题如下所示。 最先遇到这个问题是我想用Unity开发一个VR 360-degree Image Viewer。在Scene View中可以看到球体&#xff0c;但是Game View什么都看不到。最后找到的原因是&#xff0c;我使用的shader是Skybox/Panorama&#xff0c; 需要把Main Camera的Clear Flags设置成Do…

FPGA实现AXI4总线的读写_如何写axi4逻辑

FPGA实现AXI4总线的读写_如何写axi4逻辑 一、AXI4 接口描述 通道信号源信号描述全局信号aclk主机全局时钟aresetn主机全局复位&#xff0c;低有效写通道地址与控制信号通道M_AXI_WR_awid[3:0]主机写地址ID&#xff0c;用来标志一组写信号M_AXI_WR_awaddr[31:0]主机写地址&…

mongodb使用debezium

前置 服务器上需要安装jdk11 jdk下载地址 kafka安装 官网下载地址 安装教程 debezium 安装 运行 Debezium 连接器需要 Java 11 或更高版本 Debezium 并不是一个独立的软件&#xff0c;而是很多个 Kafka 连接器的总称。这些 Kafka 连接器分别对应不同的数据库&#xff0c;…

6、ES单机设置用户名密码、集群设置用户名密码、es-head登录、如何去掉密码

目录 一、ES单节点密码配置1、修改配置文件2、 重启es服务3&#xff0c;执行修改密码命令4、访问服务 二、ES集群密码配置1、确定主节点2、生成elastic-stack-ca.p123、生成elastic-certificates.p124、修改配置文件并重启集群5、进行密码配置6、验证 三、es-head登录增加密码的…

串口调速小车1

1. 让小车动起来 智能小车1-智能小车的初认识_void motor-CSDN博客 接线 B-1A -- PB0 B-1B -- PB1 A-1A -- PB2 A-1B -- PB10 CubeMx 1.常规配置 SYS->Debug->Serial Wire RCC->High Speed Clock(HSE)->Crystal/Ceramic Resonator 时钟树HSE、PLLCLK打开…

【Webgl_glslThreejs】搬运分享shader_飘落心形

来源网站 https://www.shadertoy.com/view/4sccWr效果预览 代码演示 将shadertory上的代码转成了threejs可以直接用的代码&#xff0c;引入文件的material&#xff0c;并在创建mesh或已有物体上使用material即可&#xff0c;使用时请注意uv对齐。 import { DoubleSide, Shad…

ROM修改进阶教程------如何去除安卓机型系统的开机向导 几种操作步骤解析

在和很多工作室定制化系统中。手机在第一次启动的时候系统都会进入设置向导,虽然可以设置手机的基本配置。但有很多客户需要去除手机的开机向导来缩短开机时间。确保手机直接进入工作状态。那么今天的教程针去除对开机向导的几种方法做个解析。机型很多版本不同。操作也有不同…

【产品经理修炼之道】- 从需求到功能的转化过程

产品经理的最大作用是将需求转化为产品或者功能&#xff0c;从需求到功能&#xff0c;会经历哪些过程&#xff1f;本文总结了从需求到功能的转化过程&#xff0c;希望对你进一步了解有所帮助。 “大部分的产品经理特别是数字化产品经理其核心价值就是如何去解决如何把需求转化为…

JAVAEE—HTTPS和ssl证书

0[toc] 什么是HTTPS HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层. HTTP 协议内容都是按照文本的方式明文传输的. 这就导致在传输过程中出现一些被篡改的情况而HTTPS则是新采用加密的方式进行传输 为什么需要HTTPS 为什么要使用HTTPS呢&#xff1f;这…

关于浏览器360导航无法更改

当前环境场景&#xff1a; 浏览器&#xff1a;Microsoft Edge 版本 121.0.2277.106 (正式版本) (64 位) 系统&#xff1a;Windows 11 家庭中文版 23H2 问题描述 首先出现这种情况会让我们非常的气愤但是又束手无策&#xff0c;看到这个页面简直就恨的牙根痒痒&#xff0c;但是…

VMware配置centos虚拟机实现内网互通

VMware配置centos虚拟机实现内网互通 一、安装无桌面模式 环境说明&#xff1a; VMWare版本&#xff1a;VMware Workstation 17 Pro Centos版本&#xff1a;CentOS-7.9-x86_64-DVD-2009.iso 一键下载本文资源包 1. 安装虚拟机 下面是创建具体步骤,其中需要注意的是&#xff1…

OpenHarmony开源软件供应链安全风险

慕冬亮&#xff0c;华中科技大学网络空间安全学院副教授&#xff0c;武汉英才&#xff0c;华中科技大学OpenHarmony技术俱乐部、开放原子开源社团指导教师。研究方向为软件与系统安全&#xff0c;在国际安全会议上发表十余篇论文&#xff0c;并获得ACM CCS 2018杰出论文奖。创立…

JavaEE——Spring Boot + jwt

目录 什么是Spring Boot jwt&#xff1f; 如何实现Spring Boot jwt&#xff1a; 1. 添加依赖 2、创建JWT工具类 3. 定义认证逻辑 4. 添加过滤器 5、 http请求测试 什么是Spring Boot jwt&#xff1f; Spring Boot和JWT&#xff08;JSON Web Token&#xff09;是一对常…

装饰品模式介绍

装饰器模式是一种结构型设计模式&#xff0c;它允许用户在不改变现有对象的情况下向一个对象添加新的功能。在 Java 中&#xff0c;装饰器模式经常用来动态地给对象添加额外的行为&#xff0c;如日志记录、事务管理、安全检查等。 装饰器模式涉及四个主要角色&#xff1a;组件&…

【Ant-Desgin-React 步骤条】步骤条配合组件使用

步骤条配合组件使用 基础使用多分组进度 基础使用 /* eslint-disable no-unused-vars */ import React, { useState } from react import { Button, message, Steps, theme } from antd import After from ./components/after import Now from ./components/now const steps …

IOS恢复

1、实验目的 通过本实验可以掌握&#xff1a; copy方式恢复IOS的步骤。TFTPDNLD方式恢复IOS的步骤。Xmodem方式恢复IOS的步骤。 2、实验拓扑 路由器IOS恢复的实验拓扑如下图所示。 3、实验步骤 如果工作中不慎误删除路由器IOS&#xff0c;或者升级了错误版本的IOS&#xff…

Andorid复习

组件 TextView 阴影 android:shadowColor"color/red" 阴影颜色android:shadowRadius"3.0" 阴影模糊度&#xff08;大小&#xff09;android:shadowDx"10.0" 横向偏移android:shadowDy"10.0" 跑马灯 这里用自定义控件 public cla…

【线段树 区间位运算模板】3117划分数组得到最小的值之和

本文涉及知识点 线段树 区间位运算模板 LeetCode3117. 划分数组得到最小的值之和 给你两个数组 nums 和 andValues&#xff0c;长度分别为 n 和 m。 数组的 值 等于该数组的 最后一个 元素。 你需要将 nums 划分为 m 个 不相交的连续 子数组&#xff0c;对于第 ith 个子数组…

Spring Boost + Elasticsearch 实现检索查询

需求&#xff1a;对“昵称”进行“全文检索查询”&#xff0c;对“账号”进行“精确查询”。 认识 Elasticsearch 1. ES 的倒排索引 正向索引 对 id 进行检索速度很快。对其他字段即使加了索引&#xff0c;只能满足精确查询。模糊查询时&#xff0c;逐条数据扫描&#xff0c…