C++ 内存分区模型

2023-11-01

本阶段注意针对C++面向对象编程计算左详细讲解,探讨C++中的核心和精髓。
1、内存分区模型
C++ 程序在执行时,将内存大方向划分为4个区域:
1)代码区:存放函数体的二进制代码,由操作系统进行管理的;
2)全局区:存放全局变量和静态变量以及常量。
3)栈区:由编译器自动分配释放,存放函数的参数值,局部变量等;
4)堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。
内存四区意义:
不同区域存放的数据,赋予不同的声明周期,给我们更大的灵活编程。
2、程序运行前

在程序编译后,生产了exe可执行程序,未执行改程序前分为两个区域。
代码区:
存放CPU执行的机器指令;
代码区是共享的,共享的目的是对应频繁被执行的程序,只需要在内存中有一份代码即可;
代码区是只读的,使其只读的原因是防止程序以为地修改了它的指令。
全局区:
全局变量和静态变量存放在此。
全局区还包含了常量区、字符串常量和其他常量也存放在此。
该区域的数据在程序结束后由操作系统释放。

#include <iostream>
using namespace std;

int g_c = 10;
int g_d = 10;

int main()
{
    //普通局部变量
    int a = 10;
    int b = 10;

    cout << "局部变量a的地址为:" << (int)&a << endl;
    cout << "局部变量b的地址为:" << (int)&b << endl;
    cout << "全局变量g_c的地址为:" << (int)&g_c << endl;
    cout << "全局变量g_d的地址为:" << (int)&g_d << endl;

    //静态变量,在普通变量前面加static,属于静态变量
    static int s_a = 10;
    static int s_b = 10;
    cout << "静态变量s_a的地址为:" << (int)&s_a << endl;
    cout << "静态变量s_b的地址为:" << (int)&s_b << endl;

    system("pause");
    return 0;
}

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

#include <iostream>
using namespace std;

//栈区数据注意事项 
//-- 不要返回局部变量的地址
//-- 栈区的数据由编译器管理开辟和释放


/// <summary>
/// 形参数据也会放在栈区
/// </summary>
/// <param name="b"></param>
/// <returns></returns>
int* func(int b)
{
	b = 100;
	int a = 10;  //局部变量 存放在栈区,栈区的数据在函数执行完后自动释放
	return &a;  //返回局部变量的地址
}

int main()
{
	//接受func函数的返回值
	int* p = func(1);

	cout << *p << endl;  //第一次可以打印正确的数字,是因为编译器做了保留
	cout << *p << endl;  //第二次这个数据就不再保留了

	system("pause");
	return 0;
}

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

#include <iostream>
using namespace std;

int* func()
{
    //利用new关键字 可以将数据开辟到堆区
    //指针 本质也是局部变量,放在栈上,指针保存的数据是放在堆区
    int* p = new int(10);
    return p;
}

int main()
{
    //在堆区开辟数据
    int* p = func();

    cout << *p << endl;

    system("pause");

}

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

#include <iostream>
using namespace std;

//new的基本语法
int* func()
{
    //在堆区场景整型数据
    //new返回是该数据类型的指针
    int* p = new int(10);
    return p;
}

void test01()
{
    int* p = func();
    cout << *p << endl;
    cout << *p << endl;

    //堆区的数据 由程序员管理开辟,程序员管理释放
    //如果想释放堆区的数据,利用关键字 delete
    delete p;
    cout << *p << endl;
}

//在堆区利用new开辟数组
void test02()
{
    //创建10整型数据的数组,在堆区
    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()
{
    test01();
    test02();
    system("pause");  
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 内存分区模型 的相关文章

随机推荐

  • git如何提交功能分支代码

    1 当你要写一个功能之前 先创建一个分支 在项目的终端输入 例如 git checkout b login 现在我们就创建了一个login登录分支 输入git branch 可以看到我们正处在login这个分支上面 2 当你写完这个登录功能
  • 数组越界访问会发生什么错误?怎样避免该错误?_SEGMENTATION FAULT IN LINUX 原因与避免...

    原作者 ZX WING xing5820 163 com 写得很好 加上之前的确遇到过很多信号问题 产生了很多疑问 1 什么是 Segmentation fault in Linux 我们引用wiki上的一段话来回答这个问题 A segme
  • vue 3.x 的生命周期函数与vue2的变化

    vue3 中取消了 beforeCreate与 created 这两个生命周期函数 其他的生命周期函数也发生了改变 图标中左侧是vue2中的名称 右侧是对应的vue3中的名称 beforeMount onBeforeMount mounte
  • Kibana介绍、安装和使用

    ELK中的K Kibana 下面就Kibana对ES的查询监控作介绍 就是常提到的大数据日志处理组件ELK里的K 什么是Kibana 现引用园友的一段对此的介绍 个人觉得比较全 Kibana是一个针对Elasticsearch的开源分析及可
  • Linux网络编程——TCP编程

    文章目录 前言 tcp编程相关函数 1 socket函数 2 bind函数 3 listen函数 4 accept函数 5 connect函数 6 send函数 7 recv函数 8 close函数 总结 前言 tcp编程的实现流程 tcp
  • IOException parsing XML document from class path resource [applicationContext.xml]

    今天在学习Spring框架时遇到了错误 经过报错分析发现是applicationContext xml文件位置放错了 在本地测试时 applicationContext xml文件应该放在src目录下 在服务端测试时放在WEB INF目录下
  • unity dll 位置

    在unityengine里面加 cs 然后在vs里面中看 C Program Files x86 Reference Assemblies Microsoft Framework NETFramework v3 5 Profile Unit
  • linux性能监控工具

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 引言 对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的
  • 虚拟机安装Kali Linux操作系统

    博主主站地址 微笑涛声 www cztcms cn Kali Linux是基于Debian的Linux发行版 设计用于数字取证操作系统 每一季度更新一次 由Offensive Security Ltd维护和资助 最先由Offensive S
  • 超详细!Win10(UEFI启动)安装Ubuntu18.04双系统

    UEFI模式 首先必须说明的是 有两种不同的启动模式 在安装双系统的时候的操作也不尽相同 本文是针对UEFI启动模式的安装双系统的成功案例 如果您的计算机的启动模式是Legacy 请参考其他文章 如何知道自己的电脑是哪种启动模式 找到 运行
  • VoiceChat使用心得:探索沟通的全新维度

    在数字时代 沟通方式的多样性为我们提供了更多选择 最近 我发现了一个令人兴奋的新工具 它让我重新审视了沟通的全新维度 VoiceChat 作为一个热衷于技术和交流的人 我迫不及待地想分享一下我的使用心得 VoiceChat是一种即时语音通话
  • c语言实现等价关系的判断以及等价类的输出

    原理 设X 1 2 3 n 关系R的关系矩阵是M mij 判断等价关系 1 R是自反的 lt gt m11 m22 mnn 1 2 R是对称的 lt gt lt gt mij mji 3 R是传递的 lt gt tr R R 求等价类 如果
  • C#语言参考

    C 语言参考 注意 本文并非最终文档 在最终的商业版本发布前 可能会有重大修改 而且 它属微软公司所有 它是根据接受者和微软公司间的非公开协议公布的 本文档只是为了报告的目的提供的 并且 在本文档中 微软公司并没有作任何明示或暗示的担保 对
  • Deep Laplacian Pyramid Networks for Fast and Accurate Super-Resolution论文阅读笔记

    题目 Deep Laplacian Pyramid Networks for Fast and Accurate Super Resolution 中文 深度拉普拉斯金字塔网络 可实现快速 准确的超分辨率 参考 摘要 本文提出了拉普拉斯金字
  • virtual,override,new ,extern,abstract修饰符

    方法定义中可以使用的修饰符有 a new b public c protected d internal e private f static g virtual h override i extern j abstract 对于virtu
  • 常见混沌系统—Lorenz模型

    1963年 Lorenz发现了第一个混沌吸引子 Lorenz系统 从此揭开了混沌研究的序幕 概念 在数学中 一个动力系统被称为自治的 当且仅当这个系统由一组常微分方程组成 并且这些方程的表达式与动力系统的自变量无关 在有关物理的动力系统中
  • zip压缩,使用org.apache.tools.zip实现zip压缩和解压

    1 使用apache的ant解压 org apache tools zip 2 引入pom
  • echarts解决X轴溢出数据,echarts中的boundaryGap属性

    xAxis type category boundaryGap false true才是正常的 data Date 注意 把这个设置为true才是正常的 如果设置为false两端没有留白 就会导致数据溢出
  • 同个局域网内SSH远程Ubuntu系统

    荣誉认证 51CTO博客专家博主 TOP红人 明日之星 阿里云开发者社区专家博主 技术博主 星级博主 微信公众号 iOS开发上架 本文由iOS开发上架原创 文章目录 前言 在Ubuntu系统下如何实现不同系统间的SSH连接 同一局域网环境
  • C++ 内存分区模型

    本阶段注意针对C 面向对象编程计算左详细讲解 探讨C 中的核心和精髓 1 内存分区模型 C 程序在执行时 将内存大方向划分为4个区域 1 代码区 存放函数体的二进制代码 由操作系统进行管理的 2 全局区 存放全局变量和静态变量以及常量 3