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区---代码区、全局区、栈区、堆区相关推荐

  1. 内存四区(代码区 静态区 栈区 堆区)

    参考:内存四区(代码区 静态区 栈区 堆区) 作者:今天天气眞好 发布时间: 2021-04-01 18:09:13 网址:https://blog.csdn.net/qq_51118175/arti ...

  2. C++中栈区 堆区 常量区

    原文出自:http://baike.baidu.com/view/536145.htm C++中栈区 堆区 常量区(由一道面试题目而学习) 2009-04-28 21:01 #include<i ...

  3. java的栈区 堆区存放什么_简单整理java中的栈内存, 堆内存是什么?

    上一篇文章简单整理了栈(stack), 堆(heap), 队列(queue)的结构 这一篇继续整理java中的 占内存,堆内存. Java把内存划分成两种:一种是栈内存,一种是堆内存. 这里需要解释一 ...

  4. stack vs heap:栈区分配内存快还是堆区分配内存快 ?

    作者 | 码农的荒岛求生 来源 | 码农的荒岛求生 有伙伴问到底是从栈上分配内存快还是从堆上分配内存快,这是个比较基础的问题,今天就来聊一聊. 栈区的内存申请与释放 毫无疑问,显然从栈上分配内存更快, ...

  5. C++在堆区创建数组

    new申请数据空间 c++中的new在堆区申请空间的时候的格式是: int * p = new int(10); //该代码的意思就是说在堆区申请的内存赋值为10 //int 后面括号里面写的就是你的 ...

  6. C/C++学习日记:C语言栈区与堆区浅谈

    在编程中,内存分为五大分区:栈区内存,堆区,静态区,常量区,代码区. 看下面一个函数,你能发现它又什么问题?又该如何改正? char * getString() { char str[20] = &q ...

  7. 【Java 虚拟机原理】堆区 | Java VisualVM 工具

    文章目录 一.Java VisualVM 工具 二.堆区 一.Java VisualVM 工具 Java 中提供了一个监控当前设备 Java 程序的工具 Java VisualVM ; 在命令行中执行 ...

  8. 返回局部变量或临时变量的地址_值传递和地址返回两者在堆区(Heap)应用的三种易错点...

    1.指针变量作为参数进行值传递给函数的形参,并在堆区(Heap)进行内存分配和赋值 程序源码: 1 结果: Segmentation fault (core dumped) 分析: 如上图,指针变量p ...

  9. c/c++教程 - 2.1 程序的内存模型 内存四区 代码区 全局区 堆区 栈区 new操作符

    第2章为C++核心编程. 本阶段主要针对C++面向对象编程做详细讲解. 目录 1.内存分区模型 1.1 程序运行前(代码区.全局区) 1.2 程序运行后:(栈区.堆区) 1.3 new操作符(堆区内存 ...

  10. 一条进程的栈区、堆区、数据区和代码区在内存中的映射

    一条进程的栈区.堆区.数据区和代码区在内存中的映射     1>栈区:主要用来存放局部变量, 传递参数, 存放函数的返回地址..esp 始终指向栈顶, 栈中的数据越多, esp的值越小.    ...

最新文章

  1. JavaScript小记
  2. 从封装函数到实现简易版自用jQuery (一)
  3. mysql sleep连接过多的问题解决
  4. 类选择器与ID选择器的比较
  5. 【博客话题】技术生涯中的出与入
  6. Android开发的小技巧总结
  7. 什么是Spring Boot?
  8. 第二篇 Python图片处理模块PIL(pillow)
  9. iOS小白之路...iOS中基础控件的使用
  10. VMware 安装提示缺少MicrosoftRuntime DLL 问题解决办法
  11. Python:井字棋游戏
  12. 【抽奖】知网研学福利月卡
  13. ftps软件android,透视相机软件ftp
  14. 在Clouda中使用jQuery Mobile问题解决方案
  15. Adaptive AUTOSAR和Classic AUTOSAR
  16. 自用gnome桌面美化插件
  17. Big Faceless PDF Library大型机的任何Java平台运行
  18. Markdown优雅地插入图片
  19. 适合2015年开发的10个新锐框架(上)
  20. OPENWRT 文本(shell) 配置支持oray的花生壳DDNS,Web也可以配置

热门文章

  1. python调用文件可以干嘛_Python完成读取并保存文件类的详细介绍
  2. 正高职称 程序员_我985毕业33岁正高,职称评审哪里难?轻轻松松过职称
  3. Ubuntu18.04下安装配置ORB_SLAM2以及过程中遇到的问题解决方法
  4. gb2312编码在线转换_文件打开乱码?来了解一下文件编码
  5. php 控制 打印机 打印尺寸_打破常规尺寸,得实推出宽幅条码标签单据打印机新品...
  6. 取datatable某一列的值_R-缺失值识别与处理
  7. Javascript特效:简易留言板
  8. 小白Linux入门之:常用命令介绍
  9. MpscGrowableArrayQueue分析
  10. SpringBoot2整合Flyway(二)