ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

C++基础-1-内存管理(全局区、堆区、栈区)

2022-04-30 20:31:56  阅读:150  来源: 互联网

标签:栈区 10 int 堆区 C++ func new


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++教程

标签:栈区,10,int,堆区,C++,func,new
来源: https://www.cnblogs.com/LYH-win/p/16211179.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有