C++中的内存分配

C++内存分区模式C++程序在执行时,将内存分为4个区域。 代码区:存放函数体的二进制代码,由操作系统进行管理; 全局区:存放全局变量,静态变量以及常量; 栈区:由编译器自动分配释放,存放函数的参数值,局...

C++内存分区模式

C++程序在执行时,将内存分为4个区域。

²  代码区:存放函数体的二进制代码,由操作系统进行管理;

²  全局区:存放全局变量,静态变量以及常量;

²  栈区:由编译器自动分配释放,存放函数的参数值,局部变量等;

²  堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

1.      程序运行前

在程序编译后生成了可执行的.exe程序,未执行该程序前分为两个区域:

       代码区:

              存放CPU执行的机器指令;

              代码区是共享的,目的是对于被频繁执行的程序,只需要在内存中有一份代码即可;

              代码区是只读的,原因是防止程序意外修改了他的指令;

       全局区:

              全局变量和静态变量存放在此;

              全局区还包含了常量区,字符串常量和其他常量存放在此;

              该区域的数据在程序结束后由操作系统释放;

 1 //几种变量和常量的内存分配演示
 2 #include<iostream>
 3 using namespace std;
 4 
 5 //全局变量定义
 6 int global_a = 0; 
 7 
 8 //const修饰的全局变量
 9 const int const_a =0; 
10 
11 int main()
12 {
13     //变量定义
14     int a = 0;
15     //静态变量定义
16     static int static_a= 0;
17     //常量定义
18     //字符串常量
19     string string_a = "hello";
20     //const修饰的常量
21     const int const_b = 0; 
22     
23     cout<<"局部变量的地址:"<<(int)&a<<endl; 
24     cout<<"字符串变量的地址:"<<(int)&string_a<<endl;
25     cout<<"字符串常量的地址:"<<(int)&"hello"<<endl;
26     cout<<"const修饰的全局变量的地址"<<(int)&const_a<<endl;
27     cout<<"const修饰的局部变量的地址"<<(int)&const_b<<endl;
28     cout<<"全局变量的地址:"<<(int)&global_a<<endl;
29     cout<<"静态变量的地址:"<<(int)&static_a<<endl;
30      
31     system("pause");
32     return 0;
33  } 

运行结果为:

 

 由以上运行结果可以得出:全局变量,静态变量,一些常量(字符串常量,const修饰的全局变量)是保存在全局区域;局部变量(包括字符串变量)是保存在栈区的,尤其需要注意的是const修饰的局部变量虽然是常量,但也是保存在栈区的。

2.      程序运行后

栈区:

由编译器自动分配释放,存放函数的参数值,局部变量等;

       函数中不应该范围局部变量的地址,因为在函数调用完毕后局部变量会被释放。

堆区:

       由程序员分配和释放,若没有释放,在程序运行完成后由操作系统该释放;

       主要是利用new关键字在堆区分配内存,delete关键字释放内存。

 

本文标题为:C++中的内存分配

基础教程推荐