C++ 内存分区管理

一、栈区(Stack)

栈区用来存储函数的参数值、局部变量的值等数据。栈区是自动分配和释放的,函数执行时会在栈区分配空间,函数执行结束时会自动释放这些空间。栈区的数据是连续分配的,由系统自动管理。

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

输出局部变量的地址编译器会报上述错误。

报错原因:

代码示例:如果连续输出局部变量的值,会如何输出?

#include <iostream>
using namespace std;int *func()
{//在栈区中创建局部变量int a = 10;int *ptr = &a;//返回局部变量的地址return ptr;
}int main()
{//调用函数,接收返回值int *p = func();cout<<*p<<endl;//局部变量只能返回一次,返回后栈区开辟的数据由编译器自动释放。cout<<*p<<endl;return 0;
}

运行结果:

10
0

二、堆区(Heap)

堆区用来存储动态分配的内存,程序员可以通过newdelete关键字来手动分配和释放堆区的内存。堆区的数据是不连续分配的,由程序员手动管理。

注:内存由程序员分配释放,若程序员不释放,程序结束时由操作系统回收

 代码示例:使用new和delete创建和释放堆内存,如果程序员不手动释放或者程序没有运行结束,堆内存数据不会自动释放。

#include <iostream>
#include <stdio.h>using namespace std;
int *func()
{//使用new关键字,可以将数据开辟到堆区int *p = new int(10);//返回局部变量的地址return p;
}int main()
{//调用函数,接受返回值int *p = func();cout<<*p<<endl;cout<<*p<<endl;//指针地址cout<<p<<endl;delete p;   //访问到的数据已经被覆盖,或者操作系统已经回收了这块内存等等//这种情况可能会打印出数据,但这是不安全的,不应该依赖这种行为。cout<<*p<<endl;    cout<<p<<endl;    return 0;
}

 运行结果:如果程序员不手动释放或者程序没有运行结束,堆内存数据不会自动释放。

10
10
0x1041620
17063904
0x1041620

 

创建堆内存后,会在栈里自动保存一个指针地址*p,指向堆内存地址0x7....。

三、全局/静态存储区(Global/Static Storage)

全局变量和静态变量存储在全局/静态存储区中。全局变量在程序整个执行过程中都存在,静态变量在程序生命周期内存在,但只能在定义它的函数或文件内访问。

四、代码区(Code)

代码区存储程序的执行代码,是只读的。

以上就是C++中常见的内存分区模型,理解内存分区模型对于理解内存管理和指针操作非常重要。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

llama-factory SFT 系列教程 (四),lora sft 微调后,使用vllm加速推理

文章目录 文章列表&#xff1a;背景简介llama-factory vllm API 部署融合 lora 模型权重 vllm API 部署HuggingFace API 部署推理API 部署总结 vllm 不使用 API 部署&#xff0c;直接推理数据集 tenplatevllm 代码部署 文章列表&#xff1a; llama-factory SFT系列教程 (一)&a…

鸿蒙上热搜:全国应用被华为呼唤!

日前&#xff0c;话题“华为呼吁全国应用尽快加入鸿蒙”冲上微博热搜榜。 据媒体报道&#xff0c;近日&#xff0c;华为徐直军在华为分析师大会上表示&#xff0c;打造鸿蒙原生应用生态是2024年最关键的事。华为希望通过2024年一年的时间&#xff0c;先在中国市场把智能手机上使…

C语言求自幂数(水仙花数与其他自幂数)

前言 今天我们来看一下如果求解自幂数&#xff08;水仙花数&#xff09;&#xff0c;水仙花数是自幂数的一种&#xff0c;我们来看看自幂数的概念吧&#xff0c;当一个n位数&#xff0c;它的每个位上的数字的n次幂之和等于它本身的时候&#xff0c;我们称这个数为自幂数。水仙花…

CSGO挂箱号惨遭红锁,有人亏了100万

红锁大行动真的来了&#xff0c;V社在4月16号的更新里面&#xff0c;虽然没有说关于VAC相关的更新&#xff0c;但是CS2实测&#xff0c;已经实装到了游戏里面&#xff0c;伴随着这一次更新&#xff0c;很多的新号&#xff0c;尤其是像挂箱号相继出现大量的VAC红锁。 被红锁的具…

【YOLOv8改进[Neck]】使用BiFPN助力V8更优秀

目录 一 BiFPN(双向特征金字塔网络) 1 BiFPN 2 EfficientDet 二 使用BiFPN助力模型更优秀 1 整体修改 2 配置文件 3 训练 其他 一 BiFPN(双向特征金字塔网络) BiFPN(双向特征金字塔网络&#xff0c; 2020)用于特征融合层。 官方论文地址&#xff1a;https://arxiv.org…

基于达梦数据库开发-Java篇

文章目录 前言一、示例展示1.环境准备2.采用基础的jdbc调用3.采用扩展的mybatis调用 二、注意事项1.使用路径注解2.数据库对象的准确引用 三、可能异常1.无效的表或视图名2.无效的表或视图名3.网络通信异常 总结 前言 达梦提供了JDBC方式的驱动以便进行Java开发。默认情况下相…

Unity Editor编辑器扩展之创建脚本

前言 既然你看到这篇文章了&#xff0c;你是否也有需要使用代码创建脚本的需求&#xff1f;使用编辑器扩展工具根据不同的表格或者新增的内容去创建你想要的脚本。如果不使用工具&#xff0c;那么你只能不断去修改某个脚本&#xff0c;这项工作既繁琐也浪费时间。这个时候作为程…

什么是时间序列分析

时间序列分析是现代计量经济学的重要内容&#xff0c;广泛应用于经济、商业、社会问题研究中&#xff0c;在指标预测中具有重要地位&#xff0c;是研究统计指标动态特征和周期特征及相关关系的重要方法。 一、基本概念 经济社会现象随着时间的推移留下运行轨迹&#xff0c;按…

listpack

目录 为什么有listpack? listpack结构 listpack的节点entry 长度length encoding编码方式 listpack的API 1.创建listpack 2.遍历操作 正向遍历 反向遍历 3.查找元素 4.插入/替换/删除元素 总结 为什么有listpack? ziplist是存储在连续内存空间&#xff0c;节省…

VSCode + ESP-IDF安装与配置全过程

接前一篇文章&#xff1a;ESP-IDF下载与安装完整流程 前一篇文章讲解了如何手动下载ESP-IDF&#xff0c;也就是快速入门 - ESP32 - — ESP-IDF 编程指南 latest 文档 (espressif.com)中的红色框中的部分&#xff1a; 本文讲解另一种方法&#xff0c;也是更为常用的方式 —— VS…

通俗说字解词:什么是道理?常说讲道理,李秘书讲写作这节就给你讲“道理”!

通俗说字解词&#xff1a;什么是道理&#xff1f;常说讲道理&#xff0c;李秘书讲写作这节就给你讲“道理”&#xff01; 说到“道理”&#xff0c;这可真是个有意思的词。它由“道”和“理”两个部分组成&#xff0c;就像一碗好吃的面&#xff0c;有汤有料&#xff0c;缺一不可…

MySQL-实验-单表、多表数据查询和嵌套查询

目录 0.简单子查询 &#xff08;1&#xff09;带比较运算符的子查询 &#xff08;2&#xff09;关键字子查询 1.多表查询 3.子查询 4.多表子查询 0.简单子查询 &#xff08;1&#xff09;带比较运算符的子查询 在右侧编辑器补充代码&#xff0c;查询大于所有平均年龄的员…