【C++】内存4区---代码区、全局区、栈区、堆区
every blog every motto: Light tomorrow with today.
0. 前言
简单记录下用c++四区
1. 正文
作用: 不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程。
1.1 程序运行前
在程序编译后,生成exe可执行文件,未执行该程序前分为两个区域
1.1.1 代码区
存放函数体的二进制代码,由操作系统进行管理
- 存放CPU执行的机器指令
- 代码区是共享的,共享目的是对于频繁执行的程序,只需要在内存中有一份代码疾苦
- 代码区是只读的,使其只读的原因是防止意外地修改了它的指令
1.1.2 全局区
存放全局变量和静态变量以及常量
- 全局变量和静态变量存放在此
- 全局区还包括了常量区,字符串常量和其他常量(const修饰的全局常量) 也存放在此
- 该区域的数据在程序结束后由操作系统释放
小结:
- C++中程序运行前分为全局区和代码区
- 代码区特点是共享和只读
- 全局区存放方 全局变量、静态变量、常量
- 常量区中存放了const修饰的全局常量和字符串常量
1.2 程序运行后
1.2.1 栈区
由编译器自动分配释放,存放函数的参数值、局部变量等
注意: 不要返回局部变量的地址,栈区的数据由编译器自动释放
#include<iostream>
using namespace std;int * func(int b) // 形参数据也会存放在栈区
{b = 100;int a = 10; // 局部变量存放在栈区,栈区数据在函数执行完成自动释放return &a; // 返回局部变量的地址
}int main()
{// 接受func函数的返回值int *p = func(1);cout << *p << endl; // 第一次打印正确的数字,是因为编译器做了保留cout << *p << endl; // 第二次这个数据就不再保留了cout << *p << endl;cout << *p << endl;system("pause");
}
1.2.2 堆区
由程序员分配,若程序员不释放,程序结束时由操作系统回收
在C++中主要利用new在堆区开辟内存
#include<iostream>
using namespace std;int * func()
{// 利用new关键字,可以将数据开辟到堆区// 指针 本质是局部变量,放在栈上,指针保存的数据,存放在堆区int *p = new int(10); //return p;
}int main()
{ int *point = func();cout << "函数返回值为:" << *point << endl;system("pause");
}
小结:
- 堆区数据由程序员管理开辟和释放
- 堆区数据利用new关键字进行开辟内存
1.3 new操作符(附)
- C++ 中利用new操作符进行堆区开辟数据
- 堆区开辟的数据,由程序员手动开辟,手动释放,使用利用操作符delete
- 语法: new 数据类型
- 利用new创建的数据,会返回该数据对应的类型指针
#include<iostream>
using namespace std;// 1. new的基本语法
int *func()
{// 在堆区创建整型的数据// new返回的是该数据类型的指针int *p = new int(10);return p;}// 2. 在堆区利用new开辟数组
void test02()
{// 创建10整型的数据,在堆区int *arr = new int[10]; // 10代表数组个数有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;
}
void test01()
{int *p = func();cout << *p << endl;cout << *p << endl;// 堆区的数据,由程序员管理开辟,程序员管理释放// 如果想释放堆区的数据,利用关键字deletedelete p;//cout << *p << endl; // 内存已经被释放,
}int main()
{//test01();test02();system("pause");
}
【C++】内存4区---代码区、全局区、栈区、堆区相关推荐
- 内存四区(代码区 静态区 栈区 堆区)
参考:内存四区(代码区 静态区 栈区 堆区) 作者:今天天气眞好 发布时间: 2021-04-01 18:09:13 网址:https://blog.csdn.net/qq_51118175/arti ...
- C++中栈区 堆区 常量区
原文出自:http://baike.baidu.com/view/536145.htm C++中栈区 堆区 常量区(由一道面试题目而学习) 2009-04-28 21:01 #include<i ...
- java的栈区 堆区存放什么_简单整理java中的栈内存, 堆内存是什么?
上一篇文章简单整理了栈(stack), 堆(heap), 队列(queue)的结构 这一篇继续整理java中的 占内存,堆内存. Java把内存划分成两种:一种是栈内存,一种是堆内存. 这里需要解释一 ...
- stack vs heap:栈区分配内存快还是堆区分配内存快 ?
作者 | 码农的荒岛求生 来源 | 码农的荒岛求生 有伙伴问到底是从栈上分配内存快还是从堆上分配内存快,这是个比较基础的问题,今天就来聊一聊. 栈区的内存申请与释放 毫无疑问,显然从栈上分配内存更快, ...
- C++在堆区创建数组
new申请数据空间 c++中的new在堆区申请空间的时候的格式是: int * p = new int(10); //该代码的意思就是说在堆区申请的内存赋值为10 //int 后面括号里面写的就是你的 ...
- C/C++学习日记:C语言栈区与堆区浅谈
在编程中,内存分为五大分区:栈区内存,堆区,静态区,常量区,代码区. 看下面一个函数,你能发现它又什么问题?又该如何改正? char * getString() { char str[20] = &q ...
- 【Java 虚拟机原理】堆区 | Java VisualVM 工具
文章目录 一.Java VisualVM 工具 二.堆区 一.Java VisualVM 工具 Java 中提供了一个监控当前设备 Java 程序的工具 Java VisualVM ; 在命令行中执行 ...
- 返回局部变量或临时变量的地址_值传递和地址返回两者在堆区(Heap)应用的三种易错点...
1.指针变量作为参数进行值传递给函数的形参,并在堆区(Heap)进行内存分配和赋值 程序源码: 1 结果: Segmentation fault (core dumped) 分析: 如上图,指针变量p ...
- c/c++教程 - 2.1 程序的内存模型 内存四区 代码区 全局区 堆区 栈区 new操作符
第2章为C++核心编程. 本阶段主要针对C++面向对象编程做详细讲解. 目录 1.内存分区模型 1.1 程序运行前(代码区.全局区) 1.2 程序运行后:(栈区.堆区) 1.3 new操作符(堆区内存 ...
- 一条进程的栈区、堆区、数据区和代码区在内存中的映射
一条进程的栈区.堆区.数据区和代码区在内存中的映射 1>栈区:主要用来存放局部变量, 传递参数, 存放函数的返回地址..esp 始终指向栈顶, 栈中的数据越多, esp的值越小. ...
最新文章
- JavaScript小记
- 从封装函数到实现简易版自用jQuery (一)
- mysql sleep连接过多的问题解决
- 类选择器与ID选择器的比较
- 【博客话题】技术生涯中的出与入
- Android开发的小技巧总结
- 什么是Spring Boot?
- 第二篇 Python图片处理模块PIL(pillow)
- iOS小白之路...iOS中基础控件的使用
- VMware 安装提示缺少MicrosoftRuntime DLL 问题解决办法
- Python:井字棋游戏
- 【抽奖】知网研学福利月卡
- ftps软件android,透视相机软件ftp
- 在Clouda中使用jQuery Mobile问题解决方案
- Adaptive AUTOSAR和Classic AUTOSAR
- 自用gnome桌面美化插件
- Big Faceless PDF Library大型机的任何Java平台运行
- Markdown优雅地插入图片
- 适合2015年开发的10个新锐框架(上)
- OPENWRT 文本(shell) 配置支持oray的花生壳DDNS,Web也可以配置
热门文章
- python调用文件可以干嘛_Python完成读取并保存文件类的详细介绍
- 正高职称 程序员_我985毕业33岁正高,职称评审哪里难?轻轻松松过职称
- Ubuntu18.04下安装配置ORB_SLAM2以及过程中遇到的问题解决方法
- gb2312编码在线转换_文件打开乱码?来了解一下文件编码
- php 控制 打印机 打印尺寸_打破常规尺寸,得实推出宽幅条码标签单据打印机新品...
- 取datatable某一列的值_R-缺失值识别与处理
- Javascript特效:简易留言板
- 小白Linux入门之:常用命令介绍
- MpscGrowableArrayQueue分析
- SpringBoot2整合Flyway(二)