【C++】从0到1入门C++编程学习笔记 - 核心编程篇:内存分区模型

news/2023/6/6 23:20:01

文章目录

  • 一、程序运行前
  • 二、程序运行后
  • 三、new 操作符


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

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

内存四区意义:

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


一、程序运行前

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

代码区:

​ 存放 CPU 执行的机器指令

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

​ 代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令

全局区:

​ 全局变量和静态变量存放在此.

​ 全局区还包含了常量区, 字符串常量和其他常量也存放在此

该区域的数据在程序结束后由操作系统释放.

示例:

//全局变量
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地址为: " << (int)&a << endl;cout << "局部变量b地址为: " << (int)&b << endl;cout << "全局变量g_a地址为: " <<  (int)&g_a << endl;cout << "全局变量g_b地址为: " <<  (int)&g_b << endl;//静态变量static int s_a = 10;static int s_b = 10;cout << "静态变量s_a地址为: " << (int)&s_a << endl;cout << "静态变量s_b地址为: " << (int)&s_b << endl;cout << "字符串常量地址为: " << (int)&"hello world" << endl;cout << "字符串常量地址为: " << (int)&"hello world1" << endl;cout << "全局常量c_g_a地址为: " << (int)&c_g_a << endl;cout << "全局常量c_g_b地址为: " << (int)&c_g_b << endl;const int c_l_a = 10;const int c_l_b = 10;cout << "局部常量c_l_a地址为: " << (int)&c_l_a << endl;cout << "局部常量c_l_b地址为: " << (int)&c_l_b << endl;system("pause");return 0;
}

打印结果:

请添加图片描述

总结

  • C++中在程序运行前分为全局区和代码区
  • 代码区特点是共享和只读
  • 全局区中存放全局变量、静态变量、常量
  • 常量区中存放 const修饰的全局常量 和 字符串常量

二、程序运行后

栈区:

​ 由编译器自动分配释放, 存放函数的参数值,局部变量等

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

示例:

int * func()
{int a = 10;return &a;
}int main() {int *p = func();cout << *p << endl;cout << *p << endl;system("pause");return 0;
}

堆区:

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

​ 在C++中主要利用new在堆区开辟内存

示例:

int* func()
{int* a = new int(10);return a;
}int main() {int *p = func();cout << *p << endl;cout << *p << endl;system("pause");return 0;
}

总结:

  • 堆区数据由程序员管理开辟和释放

  • 堆区数据利用new关键字进行开辟内存


三、new 操作符

​ C++中利用new操作符在堆区开辟数据

​ 堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 delete

​ 语法: new 数据类型

​ 利用new创建的数据,会返回该数据对应的类型的指针

示例1: 基本语法

int* func()
{int* a = new int(10);return a;
}int main() {int *p = func();cout << *p << endl;cout << *p << endl;//利用delete释放堆区数据delete p;//cout << *p << endl; //报错,释放的空间不可访问system("pause");return 0;
}

示例2:开辟数组

//堆区开辟数组
int main() {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 后加 []delete[] arr;system("pause");return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

速率其实是5G最弱的武器,系统BB一下5G的杀伤力指数

今天给大家聊聊5G&#xff0c;关于5G的话题最近两年非常的火爆&#xff0c;想必大家的耳朵都听出茧子了。其实大家说的最多的就是5G速率多么的高&#xff0c;其实5G牛逼之处不仅仅是快&#xff0c;还有很多比快更重要的东西&#xff0c;作为一名资深通信汪&#xff0c;今天从不…

【shell教程】| 简介及基本使用案例

文章目录一、简介二、脚本1 格式2 执行方式3 变量自定义变量特殊变量4 运算符5 条件判断6 流程控制1 if判断2 case语句3 for循环4 while 循环七、read读取控制台输入八、函数1 basename2 dirname3 自定义函数九、正则表达式十、文本处理工具1 cut2 grep3 sed4 awk一、简介 常见…

CDA lever-1 备考经验分享 转数据分析师CDA证书备考 考试相关说明

非常开心在2023年一开始就考过了CDA lever-1&#xff0c;也是今年的第一个证书&#xff0c;真真真是一个开门红&#xff0c;虽然很遗憾没有考到A&#xff0c;但是最起码得到B&#xff0c;也算过了&#xff0c;不算亏。下边是我本次考试的成绩。考试注册报名与考场报名报名考试网…

(三)CDA 数据分析师Level1考试新版大纲解析(自己整理)PART 3 数据库应用

PART 3 数据库应用 &#xff08;占比 17%&#xff09; 总体要求 理解数据库的基本概念、理解 DDL 及 DML 语言、能够根据业务需求及数据特征使用查询语言从数据库中获取准确、完整的数据信息、能够应用数据库函数进行数据处理及计算 1、数据库相关概念&#xff08;占比 1%&…

【Paper】ConvLSTM:Convolutional LSTM Network: A Machine Learning Approach for Precipitation Nowcasting

论文原文 论文下载 论文被引&#xff1a;1651&#xff08;2020/03/01&#xff09; 4827&#xff08;2022/03/26&#xff09; 论文年份&#xff1a;2015 文章目录Abstract1 Introduction2 Preliminaries2.1 Formulation of Precipitation Nowcasting Problem2.2 Long Short-Term…

ASKING FOR AND GIVING OPINIONS (from www.globalenglish.com)

Asking for Opinions We use these expressions when we want to ask what another person thinks about something. All these questions are followed by a noun or a noun phrase. How do you feel about the new television show?What do you think of my new computer?

Some Tips of Gift Giving

Some Tips of Gift Giving Some Tips of Gift GivingGifts are often given to express gratitude, friendship or hospitality. It’s a common courtesy observed in many cultures. Whenever someone receives a present, treat or invitation from a friend, they will try

SptingBoot+RabbitMQ整合出现的异常【Connection reset和Channel shutdown: connection error和ForgivingExceptionHa】

问题 启动项目后项目正常运行&#xff0c;并且RabbitMQ能够正常生产和消费消息&#xff0c;但是运行一段时间后“莫名其妙”报错&#xff0c;报错信息如下&#xff08;报错重复很多次&#xff0c;以下信息为简化后主要报错信息&#xff09;&#xff1a; 2019-06-15 12:19:48 …