一、概述
C的内存基本上分为4部分:静态存储区、堆区、栈区以及常量区。他们的功能不同,对他们使用方式也就不同。
在C++中内存分成5个区,分别是堆、栈、全局/静态存储区、常量存储区和代码区;
在执行一个C/C++语言程序时,此程序将拥有唯一的“内存四区”——栈区、堆区、全局区、代码区。每个程序都有唯一的四个内存区域。一个可执行程序在存储(没有调入内存)时分为代码段、数据区和未初始化数据区三部分,可执行程序(调入内存后)在运行时又多出两个区域:栈区和堆区。
二、基本概念
1:栈区(stack)
栈区:就是那些由编译器在需要的时候分配,在不需要的时候自动清除变量的存储区。里面的变量通常是局部变量、函数参数等。特点:由系统的编译器自动的释放,主要用来存放方法中的参数,一些临时的局部变量等,并且方法中的参数一般在操作完后,会由编译器自动的释放掉。
2:堆区(heap)
堆区:用于动态内存分配。一般由程序员手动分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收。此区域主要用来存放我们动态创建的对象、动态的申请的临时空间等。如程序在运行用malloc或new申请任意内存,程序员自己负责在何处用free或delete释放内存。该动态内存的生存期由我们决定。
3:数据区(data seg),也称为(静态区,全局区)
静态变量和全局变量的存储区域是一起的,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放。根据名称我们就应该知道用来存放一些全局的东西,比如我们经常用到的静态变量、全局变量等都会存放到数据区,此区域上的东西都被全局所共享。比如我们可以采取类名.的方式就可以访问到方法,这就是所谓的静态方法,存放到数据区的。const跟非const存储上没区别,只不过是read only的,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
4:代码区
代码区:就是存放你的程序的编译后的可执行二进制代码,CPU执行的机器指令,并且是只读的。存放代码(如函数),不允许修改(类似常量存储区),但可以执行(不同于常量存储区)。
5:常量存储区
常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
可见下图所示:
三、内存区域分配图
四、代码讲解
int a=0; //全局初始化区
char *p1; //全局未初始化区
void main()
{
int b; //栈区
char s[]="abc";//栈区
char *p2; //栈区
char *p3="123456"; //123456在常量区,p3在栈区
static int c =0;//全局(静态)初始化区
p1 = (char *)malloc(10); //程序员分配的10和20字节的区域就在堆区
p2 = (char *)malloc(20);
strcpy(p3,"123456"); //123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
声明:本博客文章属于总结性的文章,内容来自于网上和博主自己的理解!希望能帮到更多的人理解这几个概念!