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 ...
随机推荐
- okayNav jQuery 插件怎么使用
首先到 https://github.com/VPenkov/okayNav 这个网站里面把代码下载下来 下载之后解压出来,解压后打开文件app 然后创建一个HTML文档 然后倒入css的样式 样式: ...
- Iterator 和 ListIterator 有什么区别?
1.ListIterator 可以在遍历的时候,调用add()添加元素 2.ListIterator提供了更多的一些方法,如previous().hasPrevious() 等
- js身份证精确认证
function checkIdCard(idcard) { // 1 "验证通过!", 0 //身份证号码校验错误 var Errors = new Array( "1 ...
- 寄存器、特殊功能寄存器和ram之间的区别联系
存储器在CPU外,一般指硬盘,U盘等可以在切断电源后保存资料的设备,容量一般比较大,缺点是读写速度都很慢,普通的机械硬盘读写速度一般是50MB/S左右. 内存和寄存器就是为了解决存储器读写速度慢而产生 ...
- 无需Flash录视频——HTML5中级进阶
前言 HTML5的权限越来越大了,浏览器可以直接调用摄像头.麦克风了,好激动啊.我们要用纯洁的HTML代码造出自己的天地. 视频采集 本篇介绍的栗子 都是在chrome 47 版本以上的,低版本的可能 ...
- SQL语句中关于日期的操作(非常的有用)
在SQL Server 里的日期数据,我们经常可以用 字段<='2008-5-20'这样的表达式,但在oracle却不可以,因为数据类型不一样 字段是date型,'2008-5-20'是字符型, ...
- 小程序开发之一(使用fly进行http封装)
原文地址:http://callmesoul.cn 下载fly js文件 fly小程序文档 /api/config.js 配置,主要配置全局的host url和request拦截和request拦截 ...
- 前端面试题整理——VUE双向绑定原理
VUE2.0和3.0数据双向绑定的原理,并说出其区别. 代码: <!DOCTYPE html> <html lang="en"> <head> ...
- javaweb之浏览功能
今天我们来写浏览功能,浏览主要是通过sql语句将数据库里的数据查出来,并显示在页面上. 一.dao层 在上一篇文章的基础上dao层加入浏览方法. public List<Course> l ...
- VUE-SSR原理和使用
开篇N问 SSR解决了什么问题?SSR存在那些问题?SSR优点缺点是什么如何使用以及原理 自我总结了有如下优势 - SSR利于seo优化,因为实现了在node中解析vue,将实例渲染成一个字符串直接 ...