C++程序的内存分布
上节我们介绍了指针引用与常量引用。C++指针引用与常量引用
本节我们介绍C++程序的内存分布!
-
引入:在一个大的团体中,每个人都有每个人的职位。在C++中同样如此。
- 栈区(stack): 由编译器管理,存放局部变量和函数参数,很小。超出大小会导致数据溢出。
- 堆区(heap): 由程序员分配释放,随叫随到。
- 全局/静态区(static): 全局变量和静态变量的存储是放在一起的,在程序编译时分配。
- 文字常量区: 存放常量字符串。
- 程序代码区: 存放函数体(包含类的成员函数、全局函数) 的二进制代码。
-
栈区的特点: 函数在结束就会释放里面的变量。也就是生命周期结束。
-
堆区:由自己申请和释放,即动态内存!
-
要求用户决定数组的大小,此时需要申请动态内存!
注意:用完一定要释放,否者就是内存泄漏, 如果不手动进行释放,那么就会在程序结束时由操作系统释放。#include <stdio.h> using namespace std; int main(){ //定义一个数组,要求数组大小由用户输入! int size; printf("输入数组的大小:"); scanf_s("%d", &size); if (size <= 0) { printf("输入错误!"); return -1; } //使用下面的方法在某些编译器支持 //int a[size]; //分配内存空间也就是动态内存给指针 int* a; a = new int[size]; //等同于一个size大小的数组 for (int i = 0; i < size; i++) { a[i] = i; printf("%d ", a[i]); } //最后需要手动释放申请的动态内存 delete[] a; //释放后的内存不能访问! return 0; }
输出结果:
输入数组的大小:10 0 1 2 3 4 5 6 7 8 9
上面new申请的a它的生命周期到delete[] a为止
-
分配一个变量的动态内存
#include <stdio.h> using namespace std; int main(){ int* a; //int后面可以带参数也可以不带 a = new int(600); printf("%d", *a); delete a; return 0; }
输出结果:
600
此处只分配了一个int大小的动态内存。
-
全局静态区:
#include <stdio.h> using namespace std; //a就是全局变量 int a = 100; void test() { //在test中打印全局变量 printf("a = %dn", a); //静态变量b只能在该函数中使用 static int b = 10; b += 20; //不能在别的函数中调用静态变量b printf("b = %dn", b); } int main() { //调用两次test(); test(); test(); return 0; }
输出结果:
a = 100 b = 30 a = 100 b = 50
在编译时就给全局变量和静态变量分配了内存。
-
文字常量区:存放字符串常量。
#include <stdio.h> using namespace std; int main() { //字符常量区 const char* a = "苹果"; const char* b = "苹果"; printf("a的地址0x%pn", a); printf("b的地址0x%p", b); return 0; }
输出结果:
0x00571D24 0x00571D24
相同文字常量地址相同!
-
代码区:存放二进制指令,所有函数最后都会转换成二进制指令。
本节讲了C++的内存布局,下节我们介绍为什么使用动态内存分配。
最后
以上就是失眠石头最近收集整理的关于C++程序的内存分布C++程序的内存分布的全部内容,更多相关C++程序内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复