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 ...
随机推荐
- 使用 JDBC 操作数据库时,如何提升读取数据的性能?如 何提升更新数据的性能?
要提升读取数据的性能,可以指定通过结果集(ResultSet)对象的 setFetchSize() 方法指定每次抓取的记录数(典型的空间换时间策略):要提升更新数据的性能 可以使用 PreparedS ...
- docker打包镜像,测试部署
docker基本入门以后,(docker基本入门https://www.cnblogs.com/yangyangming/p/11470926.html)可以试试打包docker镜像与dockerfi ...
- 名词解析-RPC
什么是RPC RPC 的全称是 Remote Procedure Call 是一种进程间通信方式.它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程 ...
- 转载:2017百度春季实习生五道编程题[全AC]
装载至:https://blog.csdn.net/zmdsjtu/article/details/70880761 1[编程题]买帽子 时间限制:1秒空间限制:32768K度度熊想去商场买一顶帽子, ...
- piwik安装部署
1.piwik介绍 Piwik是一个PHP和MySQL的开放源代码的Web统计软件,它给你一些关于你的网站的实用统计报告,比如网页浏览人数,访问最多的页面,搜索引擎关键词等等. Piwik拥有众多不同 ...
- js技术之根据name获取input的值
一.前端的代码 <p>Name: <input type='text', name = 'name'/></p> <p>Age: <input t ...
- C语言之基本组成(知识点6)
一.C程序基本组成 C程序是由语句组成的,通常包括一个或多个函数,其中有且只有一个函数称为 主函数,其函数名为main. 二.C程序的组成特点: 1.每个C程序由一个或多个函数组成.每个C程序有且仅有 ...
- 什么是Viewport Meta(width详解)及在手机上的应用
viewport是专为手机浏览器设计的一个meta标签: 有些屏幕很小有智能手机,但分辩率却可以做得很大,比如小米4的默认分辨率为:1920*1080,比许多电脑桌面的都还大,传统桌面网站直接放到手机 ...
- 微信小程序&mpvue问题总结(1)
微信小程序进入到首页的时候,日志打印出"created", "onlaunch", "mounted",具体代码如下:那么,在小程序中 cr ...
- ES6-11学习笔记--数值的扩展
二进制 0B 八进制 0O Number.isFinite() , Number.isNaN() Number.parseInt() , Number.parseFloat() Number ...