1. 内存管理

1.1 全局区

 1 #include<iostream>
2 using namespace std;
3
4 // 全局变量
5 int g_a = 10;
6 int g_b = 10;
7
8 // const修饰的全局变量,全局常量
9 const int c_g_a = 10;
10 const int c_g_b = 10;
11
12 int main() {
13
14 //全局区
15
16 //全局变量、静态变量、常量
17 //常量:字符串常量、const修饰的全局变量
18
19 //创建普通局部变量
20 int a = 10;
21 int b = 10;
22
23 cout << "局部变量a的地址为: " << (int)&a << endl;
24 cout << "局部变量b的地址为: " << (int)&b << endl;
25 cout << "全局变量g_a的地址为: " << (int)&g_a << endl;
26 cout << "全局变量g_b的地址为: " << (int)&g_b << endl;
27
28
29 // 静态变量 加static
30 static int s_a = 10;
31 static int s_b = 10;
32 cout << "静态变量s_a的地址为: " << (int)&s_a << endl;
33 cout << "静态变量s_b的地址为: " << (int)&s_b << endl;
34
35
36 // 常量
37 // 字符串常量
38 cout << "字符串常量的地址为: " << (int)&"hello world!" << endl;
39
40
41 // const修饰的变量
42 //const修饰的全局变量
43 cout << "const修饰的全局变量c_g_a的地址为: " << (int)&c_g_a << endl;
44 cout << "const修饰的全局变量c_g_b的地址为: " << (int)&c_g_b << endl;
45
46 //const修饰的局部变量
47 const int c_l_a = 10;
48 const int c_l_b = 10;
49
50 cout << "const修饰的局部变量c_l_a的地址为: " << (int)&c_l_a << endl;
51 cout << "const修饰的局部变量c_l_b的地址为: " << (int)&c_l_b << endl;
52
53 system("pause");
54
55 return 0;
56 }
57
58 //总结
59 //内存四区:代码去(程序运行前)、全局区(程序运行前)、栈区、堆区
60 //代码区:存放CPU指令,共享+只读的特点
61 //全局区:全局变量、静态变量、常量(字符串常量、const修饰的全局变量(全局常量))
62 //全局区的数据再程序结束后由系统释放

1.2 栈区

 1 #include<iostream>
2 using namespace std;
3
4 // 栈区数据注意事项 --不要返回局部变量的地址
5 // 栈区的数据由编译器管理开辟和释放
6 // 形参数据也放在栈区
7
8 int* func() {
9 int a = 10; //局部变量 存放在栈区,栈区的数据在函数执行完成后自动释放
10 return &a; //返回局部变量的地址,错误示例
11 }
12
13 int main() {
14
15 //使用指针接受func函数的返回值
16 //int* p = func();
17 //cout << *p << endl;
18 //程序报错“返回局部变量或临时变量的的地址”
19
20 system("pause");
21
22 return 0;
23 }
24
25 //总结
26 //栈区:编译器自动分配与释放,存放函数的参数值、局部变量
27 //注意:不能返回局部变量的地址,栈区开辟的数据由编译器自动释放

1.3 堆区

 1 #include<iostream>
2 using namespace std;
3
4 int* func() {
5 //利用new关键字 可以将数据开辟到堆区,delete关键字用来释放
6
7 //new int(10); 创建堆区数据,初始化为10,产生该数据的地址
8 //可以使用指针来接收
9
10 //指针的本质是局部变量,存放在栈区,指针保存的数据存放在堆区
11
12 int* p = new int(10);
13
14 return p;
15
16 }
17
18 int main() {
19
20 //在堆区开辟数据
21 int* p = func();
22
23 cout << *p << endl;
24 cout << *p << endl;
25
26 system("pause");
27
28 return 0;
29
30 }
31
32 //总结
33 //堆区数据由程序员管理开辟和释放
34 //堆区数据利用new关键字进行开辟内存,并返回地址
35 //new开辟的堆区内存通过delete关键字进行释放

1.4 new操作符

 1 #include<iostream>
2 using namespace std;
3
4 //1、new的基本语法
5 int* func() {
6 //在堆区创建整型数据
7 //new返回的是 该数据类型的指针
8 int* p = new int(10);
9 return p;
10 }
11
12 void test01() {
13 int* p = func();
14 cout << *p << endl;
15 cout << *p << endl;
16 cout << *p << endl;
17 //堆区数据 由程序员管理开辟,程序员管理释放;
18 //如果想释放堆区数据,利用关键字 delete;
19
20 delete p;
21 //cout << *p << endl;//内存已经被释放,再次访问就是非法操作,会报错;
22 }
23
24 //2、在堆区利用new开辟数组
25
26
27 void test02() {
28 //在堆区,创建10整型数据的数组
29 //使用[]在堆区创建数组
30 int* arr = new int[10]; //10表示数组有10个元素
31 for (int i = 0; i < 10; i++) {
32 arr[i] = i + 100; //给是个元素赋值 100~109
33 }
34
35 for (int i = 0; i < 10; i++) {
36 cout << arr[i] << endl;
37 }
38
39 //释放堆区数字
40 //释放数组要记得加[],表示释放数组
41 delete[] arr;
42 }
43
44
45 int main() {
46
47 //test01();
48 test02();
49 system("pause");
50 return 0;
51 }
52
53
54
55
56 //总结
57 //C++利用new关键字开辟堆区数据
58 //堆区数据由程序员手动开辟,手动释放,关键字delete
59 // 语法:new 数据类型
60 // 利用new创建的数据,会返回该数据对应类型的指针
61 //

参考:《黑马程序员》C++教程

C++基础-1-内存管理(全局区、堆区、栈区)的更多相关文章

  1. Java_基础_内存管理

    把没几多年,完全忘记了把自己学的东西记录下来了,现在也基本不知道怎么去记录会更好了,不过好歹妹是把住了~也要毕业了,继续回来写东东记录自己的学习...... 一个Java程序在运行时的内存分布主要如上 ...

  2. 转:C/C++内存管理详解 堆 栈

    http://chenqx.github.io/2014/09/25/Cpp-Memory-Management/ 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了 ...

  3. 【IOS学习基础】内存管理

    1.内存几大区域 1> 栈区:局部变量(基本数据类型.指针变量). 2> 堆区:程序运行的过程中动态分配的存储空间(创建的对象). 3> BSS段:没有初始化的全局变量和静态变量. ...

  4. 内存分配方式,堆区,栈区,new/delete/malloc/free

    1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. [2]在栈上创建.在执行函数时 ...

  5. (三)java虚拟机内存管理和线程独占区和线程共享区

    一.内存管理 二.线程独占区之程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节 ...

  6. .NET基础拾遗(1)类型语法基础和内存管理基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  7. Java基础--Java内存管理与垃圾回收

      Java自动内存管理 在讲解内存管理之前,首先需要了解对象和对象引用的区别 对象是类的一个实例,以人这个类为例,Person是我们定义的一个类 public class Person{} publ ...

  8. 2-Python基础语法-内存管理-运算符-程序控制

    目录 1 Python 基础语法 1.1 注释 1.2 缩进 1.3 续行 1.4 标识符 1.5 转义序列 1.6 数字 1.7 字符串 1.8 其他 2 Python 运算符 2.1 赋值运算符 ...

  9. 《C#高级编程》学习笔记----c#内存管理--栈VS堆

    本文转载自Netprawn,原文英文版地址 尽管在.net framework中我们不太需要关注内存管理和垃圾回收这方面的问题,但是出于提高我们应用程序性能的目的,在我们的脑子里还是需要有这方面的意识 ...

  10. c#基础-自动内存管理

    1.自动垃圾回收是什么?     在非托管环境下程序员要自已管理内存,由疏忽的原因,通常会犯两种错误,请求内存后在不使用时忘记释放,或使用已经释放了的内存.但在托管环境下,程序员不用担心这两个问题,C ...

随机推荐

  1. ZooKeeper 面试题?

    ZooKeeper 是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群 中各个节点的状态根据节点提交的反馈进行下一步合理操作.最终,将简单易用 的接口和性能高效.功能稳定的系统提供给用户. ...

  2. 访问修饰符 public,private,protected,以及不写(默认) 时的区别?

    修饰符 当前类 同 包 子 类 其他包 public √ √ √ √ protecte d √ √ √ × default √ √ × × private √ × × × 类的成员不写访问修饰时默认为 ...

  3. elasticsearch 是如何实现 master 选举的 ?

    面试官:想了解 ES 集群的底层原理,不再只关注业务层面了. 前置前提: 1.只有候选主节点(master:true)的节点才能成为主节点. 2.最小主节点数(min_master_nodes)的目的 ...

  4. JVM 选项 -XX:+UseCompressedOops 有什么作用? 为什么要使用?

    当你将你的应用从 32 位的 JVM 迁移到 64 位的 JVM 时,由于对象的指针从 32 位增加到了 64 位,因此堆内存会突然增加,差不多要翻倍.这也会对 CPU 缓存(容量比内存小很多)的数据 ...

  5. Linux分区问题

    一.基本分区的作用及其大小 /boot分区: 存放引导文件和Linux内核文件等. 引导文件:判断启动哪一个操作系统或启动哪个内核. 内核:管理硬件和软件资源,程序与硬件之间的桥梁. 分区大小:100 ...

  6. SQL函数对应的数据库(案例)

  7. 3_一起燃烧卡路里/科学减肥(1)_系统分析实例_数学建模部分_Matlab/Simulink

     

  8. 创建TypeScript代码模板(NVS+Yarn+ESLint+Prettier+Husky)

    创建TypeScript代码模板(NVS+Yarn+ESLint+Prettier+Husky) Cui, Richard Chikun 本文笔者将带你在Github代码仓库创建TypeScript代 ...

  9. 【babel+小程序】记“编写babel插件”与“通过语法解析替换小程序路由表”的经历

    话不多说先上图,简要说明一下干了些什么事.图可能太模糊,可以点svg看看 背景 最近公司开展了小程序的业务,派我去负责这一块的业务,其中需要处理的一个问题是接入我们web开发的传统架构--模块化开发. ...

  10. 【Android开发】简单好用的阴影库 ShadowLayout

    先来看一张使用 ShadowLayout 库实现的各种阴影的效果图,如下图所示: 如上图所示,通过使用 ShadowLayout 可以控制阴影的颜色.范围.显示边界(上下左右四个边界).x 轴和 y ...