C++基础——内存分区模型

这篇具有很好参考价值的文章主要介绍了C++基础——内存分区模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 概述

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

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

内存分区的意义是不同区域存放不同的数据,给数据赋予不同的生命周期,加大数据处理的灵活度。

2 程序运行前

程序编译后,生成可执行文件,在程序执行前,可以分为两个区域:
代码区
存放CPU执行的机器指令
代码区是共享的,共享的目的是对于频繁执行的程序,只需要一份代码即可
代码区是只读的,只读可以防止修改程序意外修改了指令导致程序出错
全局区
全局变量和静态变量存放在全局区
全局区还包含了常量区,字符串常量和其他字面常量都存放于此
该区域内存由程序结束后操作系统释放

代码示例:

#include <iostream>
using namespace std;

typedef long long ll;

//全局变量
int g_a = 10;
int g_b = 10;

//全局常量
const int c_g_a = 10;
const int c_g_b = 10;

int main() {

    //局部变量
    int a = 10;
    int b = 10;

    //打印地址
    cout << "局部变量a地址为: " << (ll)&a << endl;
    cout << "局部变量b地址为: " << (ll)&b << endl;

    cout << "全局变量g_a地址为: " <<  (ll)&g_a << endl;
    cout << "全局变量g_b地址为: " <<  (ll)&g_b << endl;

    //静态变量
    static int s_a = 10;
    static int s_b = 10;

    cout << "静态变量s_a地址为: " << (ll)&s_a << endl;
    cout << "静态变量s_b地址为: " << (ll)&s_b << endl;

    cout << "字符串常量地址为: " << (ll)&"hello world" << endl;
    cout << "字符串常量地址为: " << (ll)&"hello world1" << endl;

    cout << "全局常量c_g_a地址为: " << (ll)&c_g_a << endl;
    cout << "全局常量c_g_b地址为: " << (ll)&c_g_b << endl;

    const int c_l_a = 10;
    const int c_l_b = 10;
    cout << "局部常量c_l_a地址为: " << (ll)&c_l_a << endl;
    cout << "局部常量c_l_b地址为: " << (ll)&c_l_b << endl;

    return 0;
}

C++基础——内存分区模型,C++语言,c++,java,jvm
局部变量和局部常量都存储到栈区,超出作用域之后回收。全局变量和静态变量存储在全局区,常量也是存放在全局区,都是程序结束后操作系统释放。
常量区存放const修饰的全局常量和字符串常量。

3 程序运行后

程序运行后主要可分为栈区和堆区。
栈区
栈区由编译器自动分配,通常用于存放局部变量和函数参数。
不要返回局部变量的地址,因为局部变量在栈区开辟,函数返回后局部变量会自动回收。

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

int main() {

    int *p = func();

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

    return 0;
}

输出

Process finished with exit code -1073741819 (0xC0000005)

由于返回的是局部变量的地址,函数返回后,局部变量内存被回收,此时使用指针访问该内存出现错误,访问了非法内存。

堆区
由程序员分配并主动释放,如果分配后没有释放会导致该内存无法重新使用,得程序结束后才会释放。
堆区内存通过new分配,通过delete回收

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

int main() {

    int *p = func();

    cout << *p << endl;

	delete p;
    return 0;
}

使用new分配,使用delete回收。

4 new操作符

new操作符用于在堆中分配内存,返回分配了内存的地址,可以使用指针接收

int* num = new int(10);
delete num;

int* arr = new int[10];
delete[] arr;

Person* person = new Person();
delete person;

可以动态分配基本数据类型数据、数据类型数据、对象等。文章来源地址https://www.toymoban.com/news/detail-723824.html

到了这里,关于C++基础——内存分区模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [JVM] 浅谈JMM(Java 内存模型)

    Java 内存模型(Java Memory Model,JMM)是 Java 虚拟机规范中定义的一种抽象计算机内存模型,用于描述 Java 程序在多线程下的内存访问行为。JMM 定义了线程之间共享变量的可见性和有序性规则,为开发者提供了一种可靠的同步机制,以避免并发程序中常见的线程安全问题。 JMM

    2024年01月16日
    浏览(54)
  • 【JVM】内存分区

    程序在执行之前先要把java代码转换成字节码(class文件). JVM 首先需要把字节码通过类加载器(ClassLoader) 把文件加载到内存中 运行时数据区(Runtime Data Area) . 而字节码文件是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器 执行引

    2024年02月07日
    浏览(52)
  • 3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优

    一篇文章掌握整个JVM,JVM超详细解析!!! JVM (Java虚拟机) 是运行 Java 字节码 的 虚拟机 。 JVM 针对 不同系统 有 特定实现 ( Windows 、 Linux 等),目的是 同样的代码 在 不同平台 能运行出 相同的结果 。 Java 语言 要经过 编译 和 解释 两个步骤: 编译 :通过 编译器 将 代码 一

    2024年02月15日
    浏览(50)
  • 区分什么是Java内存模型(JMM)和 JVM运行时数据区

    Java的内存区域和内存模型是不一样的东西,内存区域是指 JVM 运行时将数据分区域存储,强调对内存空间的划分 。 而内存模型(Java Memory Model,简称 JMM )是 定义了线程和主内存之间的抽象关系,即 JMM 定义了 JVM 在计算机内存(RAM)中的工作方式 ,如果我们要想深入了解Java并

    2024年02月11日
    浏览(50)
  • JVM内存管理、内存分区:堆、方法区、虚拟机栈、本地方法栈、程序计数器

    线程共享 堆         存放 实例 ,字符串常量(直接引用),静态变量,线程分配缓冲区(TLAB线程私有)。 垃圾收集器 管理的区域 方法区         非堆,和堆相对的概念。存储已被虚拟机加载的 类型信息 、常量、静态变量、即时编译器编译后的代码缓存等数据,内

    2024年02月10日
    浏览(41)
  • 【Java高级应用:深入探索Java编程的强大功能,JVM 类加载机制, JVM 内存模型,垃圾回收机制,JVM 字节码执行,异常处理机制】

    本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:

    2024年01月16日
    浏览(90)
  • JVM零基础到高级实战之Java内存区域本地方法栈

    JVM零基础到高级实战之Java内存区域本地方法栈 JVM零基础到高级实战之Java内存区域本地方法栈 本地方法栈是什么? 用于作用域本地方法执行的一块Java内存区域 为什么要有本地方法栈? 与Java虚拟机栈相同,每个方法在执行的同时都会创建一个栈帧(Stack Framel)用于存储局部

    2024年02月09日
    浏览(41)
  • jvm 程序计算器 程序计数器是否溢出 程序计数器是做什么的 java程序计数器会内存溢出吗 程序计数器作用与用处 jvm内存模型 jvm合集(一)

    1. jvm内存模型:     内存模型:                     程序计数器                     堆                     栈                     本地方法栈                     方法区 2. java代码编译为class文件,由类加载器加载到jvm,然后

    2024年02月09日
    浏览(48)
  • c++内存的四大分区详解

    目录 前言: 1、程序的基本运行流程 2,为啥要分为四个区域? 3,分为哪四个区域? 4,4个区域详解 代码区: 为什么会设置这两个功能呢? 全局区: 栈区: 堆区:  new: 补充知识:new 总结: 这篇博客介绍 c++四大分区 的详解,其中也会涉及到有关 new 的知识

    2024年02月20日
    浏览(40)
  • 【JVM】JVM内存模型详解

    一、JVM是什么? JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在

    2024年02月14日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包