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 ...
随机推荐
- Mybatis 动态 sql 有什么用?执行原理?有哪些动态 sql?
Mybatis 动态 sql 可以在 Xml 映射文件内,以标签的形式编写动态 sql,执行原理 是根据表达式的值 完成逻辑判断并动态拼接 sql 的功能. Mybatis 提供了 9 种动态 sql ...
- Spring-MVC 里面的ModelAndView
作用: 由于本身http是无状态的并不会保存什么请求信息. 但是目标页面可能又需要一些信息.这时候可以用ModelAndView存放一些业务数据之类等.然后返回给页面 用法: 比较重要的方法: 往对 ...
- Java 中 ++ 操作符是线程安全的吗?
不是线程安全的操作.它涉及到多个指令,如读取变量值,增加,然后存 储回内存,这个过程可能会出现多个线程交差.
- (stm32f103学习总结)—can总线
参考:CAN总线的位时序与参数设置 CAN总线位同步 1 CAN总线介绍 CAN 是Controller Area Network 的缩写,中文意思是控制器局域网 络,是ISO国际标准化的串行通信协议 ...
- 什么是RESTFUL?REST的请求方法有哪些,有什么区别?
这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [什么是REST ...
- devicePixelRatio 那些事儿
devicePixelRatio 那些事儿 设备像素比 window.devicePixelRatio 是设备上物理像素和设备独立像素的比例,即公式表示为:window.devicePixelRati ...
- CSS的inline、block与inline-block
基本知识点 行内元素一般是内容的容器,而块级元素一般是其他容器的容器,行内元素适合显示具体内容,而块级元素适合做布局. 块级元素(block):独占一行,对宽高的属性值生效:如果不给宽度,块级元素就默 ...
- vue引入swiper
https://github.com/surmon-china/vue-awesome-swiper/blob/master/examples/03-pagination.vue https://su ...
- 一篇文章带你整明白HTTP缓存知识
最近看了很多关于缓存的文章, 每次看完,看似明白但是实际还是没明白,这次总算搞明白协商缓存是怎么回事了 首先,服务器缓存分强制缓存和协商缓存(也叫对比缓存) 强制缓存一般是服务端在请求头携带字段Exp ...
- 什么是3D建模?
一.3D建模是什么 将所见所想用立体三维的方式通过计算机技术表现出来,这就是3D建模,比如你看到了一个可爱呆萌的卡通人物又或是华丽酷炫的变形金刚,总之就是你认为美好的立体实物 你想将它用计算机技术完美 ...