c++内存分区模型(四个区)
c++在程序执行的时候将内存分为四个区: 1.代码区 存放函数体的二进制代码,有操作系统管理 包括你写的那些注释都在这 2.全局区 存放全局变量,静态变量,常量 常量:字符串常量 3.栈区 存放函数参数值和局部变量,由编译器自动分配和释放 4.堆区 有程序员分配和释放,如果程序员不释放,那么程序结束时将由操作系统回收 那么为什么要分为四个区呢? 因为不同区域存放的数据,具有不同生命周期,这大大地时我们编程更加灵活 ? 代码区的特点 存放cpu执行的机器指令 共享(生产一份exe文件即可),只读(防止程序意外地修改指令) ? 全局区: 它和代码区都是在程序执行前弄好的 该区域的数据在程序结束后有操作系统回收 存放全局变量,静态变量,常量 下面做一些演示 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int g_a = 1,g_b = 1; 5 const int c_g_a = 1; 6 const int c_g_b = 1; 7 int main() 8 { 9 int a = 1,b = 1; 10 cout << "局部变量a的地址为: " << &a << endl; 11 cout << "局部变量b的地址为: " << &b << endl; 12 13 cout << "全局变量g_a的地址为: " << &g_a << endl; 14 cout << "全局变量g_b的地址为: " << &g_b << endl; 15 16 static int s_a = 1,s_b = 1; 17 cout << "静态变量s_a的地址为: " << &s_a << endl; 18 cout << "静态变量s_b的地址为: " << &s_b << endl; 19 20 cout << "字符串常量地址为: " << &"hello world!" << endl; 21 22 const int l_g_a = 1; 23 const int l_g_b = 1; 24 cout << "全局常量c_g_a的地址为: " << &c_g_a << endl; 25 cout << "全局常量c_g_b的地址为: " << &c_g_b << endl; 26 27 cout << "局部常量l_g_a的地址为: " << &l_g_a << endl; 28 cout << "局部常量l_g_b的地址为: " << &l_g_b << endl; 29 return 0; 30 } 运行之后看每个变量的地址形式就发现异同了 我的有乱码 ? 3.栈区 存放函数参数值和局部变量,由编译器自动分配和释放 需要注意的是函数不能返回局部变量的地址 为什么呢? 看一下下面的代码 #include<bits/stdc++.h> int *fun() int main() 为什么第一次输出是对的而第二次输出是错的? 因为编译器会帮你保留一次这个数据,但不会一直保留。 4.堆区 有程序员分配和释放,如果程序员不释放,那么程序结束时将由操作系统回收 c++中用new来开辟相关类型的内存 delet 来释放 来看看代码 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int *fun() 5 { 6 int *p = new int(101); 7 return p; 8 } 9 10 int main() 11 { 12 int *p = fun(); 13 cout << *p << endl; 14 cout << *p << endl; 15 cout << *p << endl; 16 cout << *p << endl; 17 return 0; 18 } 看到没有四次输出都一样,因为在这地方我们并没有释放 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |