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