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;  
 } 

 

 

 

posted on 2016-04-25 14:09  mh-lhw  阅读(75)  评论(0)    收藏  举报

导航