C++基础-1-内存管理(全局区、堆区、栈区)
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-内存管理(全局区、堆区、栈区)的更多相关文章
- Java_基础_内存管理
把没几多年,完全忘记了把自己学的东西记录下来了,现在也基本不知道怎么去记录会更好了,不过好歹妹是把住了~也要毕业了,继续回来写东东记录自己的学习...... 一个Java程序在运行时的内存分布主要如上 ...
- 转:C/C++内存管理详解 堆 栈
http://chenqx.github.io/2014/09/25/Cpp-Memory-Management/ 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了 ...
- 【IOS学习基础】内存管理
1.内存几大区域 1> 栈区:局部变量(基本数据类型.指针变量). 2> 堆区:程序运行的过程中动态分配的存储空间(创建的对象). 3> BSS段:没有初始化的全局变量和静态变量. ...
- 内存分配方式,堆区,栈区,new/delete/malloc/free
1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. [2]在栈上创建.在执行函数时 ...
- (三)java虚拟机内存管理和线程独占区和线程共享区
一.内存管理 二.线程独占区之程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节 ...
- .NET基础拾遗(1)类型语法基础和内存管理基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...
- Java基础--Java内存管理与垃圾回收
Java自动内存管理 在讲解内存管理之前,首先需要了解对象和对象引用的区别 对象是类的一个实例,以人这个类为例,Person是我们定义的一个类 public class Person{} publ ...
- 2-Python基础语法-内存管理-运算符-程序控制
目录 1 Python 基础语法 1.1 注释 1.2 缩进 1.3 续行 1.4 标识符 1.5 转义序列 1.6 数字 1.7 字符串 1.8 其他 2 Python 运算符 2.1 赋值运算符 ...
- 《C#高级编程》学习笔记----c#内存管理--栈VS堆
本文转载自Netprawn,原文英文版地址 尽管在.net framework中我们不太需要关注内存管理和垃圾回收这方面的问题,但是出于提高我们应用程序性能的目的,在我们的脑子里还是需要有这方面的意识 ...
- c#基础-自动内存管理
1.自动垃圾回收是什么? 在非托管环境下程序员要自已管理内存,由疏忽的原因,通常会犯两种错误,请求内存后在不使用时忘记释放,或使用已经释放了的内存.但在托管环境下,程序员不用担心这两个问题,C ...
随机推荐
- 什么是 Swagger?你用 Spring Boot 实现了它吗?
Swagger 广泛用于可视化 API,使用 Swagger UI 为前端开发人员提供在线沙箱.Swagger 是用于生成 RESTful Web 服务的可视化表示的工具,规范和完整框架实现.它使文档 ...
- 什么是Spring MVC框架的控制器?
控制器提供一个访问应用程序的行为,此行为通常通过服务接口实现.控制器解析用户输入并将其转换为一个由视图呈现给用户的模型.Spring用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器.
- Springboot添加静态资源映射addResourceHandlers,可实现url访问
@Configuration //public class WebMvcConfiger extends WebMvcConfigurerAdapter { public class WebMvcCo ...
- Spring-boot-菜鸟-快速创建应用
file-new-project 选择Spring boot ,然后选择自己的配置类型,maven jdk版本等 结果: 目录解析: resources文件夹中目录结构 static:保存所有的静态 ...
- Java中final的使用
原文链接https://www.cnblogs.com/dolphin0520/p/10651845.html 作者Matrix海 子 本文为笔记 0. 概述 final和static一样都是修饰词, ...
- DIANA算法
DIANA算法 DIANA算法示例 DIANA算法练习
- C++ | 再探智能指针(shared_ptr 与 weak_ptr)
上篇博客我们模拟实现了 auto_ptr 智能指针,可我们说 auto_ptr 是一种有缺陷的智能指针,并且在C++11中就已经被摈弃掉了.那么本章我们就来探索 boost库和C++11中的智能指针以 ...
- Altium Designer 原理图的绘制前导
元件库.封装库设计 部分元器件厂商或者经销商不提供元件库和封装库,只给了元器件尺寸图,所以需要自行设计元件库文件或是封装库文件 元件库设计: 新建 .SchLib 文件:File -> N ...
- 【动态系统的建模与分析】8_频率响应_详细数学推导 G(jw)_滤波器
- HTML5 Canvas学习之路(六)
一个炫酷的计时器 在慕课网看到一个canvas的课,感觉很炫酷,就把它看完了,然后记下来.http://www.imooc.com/learn/133 第一步:绘制要显示的时间 拿小球来绘制具体的数字 ...