C/C++中内存模型
下面是一张APUE中的C内存空间分布图

大体来讲C++内存分为5个区域,分别如下
1. 堆 heap :
由new分配的内存块,其释放编译器不去管,由我们程序自己控制(一个new对应一个delete)。如果程序员没有释放掉,在程序结束时OS会自动回收。涉及的问题如:“缓冲区溢出”、“内存泄露”等,从低地址向高地址增加。
2. 栈 stack :
是那些编译器在需要时分配,在不需要时自动清除的存储区。存放局部变量、函数参数。存放在栈中的数据只在当前函数及下一层函数中有效,一旦函数返回了,这些数据也就自动释放了。从高地址向低地址增加。
3. 全局/静态存储区 (.bss段和.data段) :
全局和静态变量被分配到同一块内存中。在C语言中,未初始化的放在.bss段中,初始化的放在.data段中;在C++里则不区分了。 在C语言中,可读写区从低地址到高地址分成两个部分,第一部分是已经初始化的(.data),第二部分是未初始化的(.bss)。已经初始化的区域,从低地址到高地址,先是全局初始化的,后面是局部静态初始化的。未初始化区域,从低地址到高地址,先是局部静态未初始化的,后是全局未初始化的。
4. 常量存储区 (.rodata段) :
存放常量,不允许修改(通过非正当手段也可以修改),常量字符串就是放在文字常量区,程序结束后由系统释放。
5. 代码区 (.text段) :
存放代码(如函数),不允许修改(类似常量存储区),但可以执行(不同于常量存储区)
下面用代码表示一下
int g_a; // 全局未初始化区 int g_b = 0; // 全局初始化区 char* g_p1; // 全局未初始化区 char* g_p2 = 0; // 全局初始化区 int main() { static int d ; // 全局未初始化区 static int c =0; // 全局初始化区 int a;// 栈区 int b = 0;// 栈区 char s[] = "abc"; // 栈区 char* p2; // 栈区 char* p3 = "123456"; // "123456/0" 在常量区,p3在栈区 g_p1 = (char *)malloc(20); // 分配得来的20字节的区域就在堆区 strcpy(g_p1, "123456"); // "123456/0" 放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 return 0; }
浙公网安备 33010602011771号