C++中的内存分配
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关键字释放内存。