C的内存分为4部分:静态存储区、堆区、栈区以及常量区。
C++中内存分成5个区,分别是堆、栈、全局/静态存储区、常量存储区和代码区; 内存四区是指:栈区,堆区,全局区,代码区。
栈区:
就是那些由编译器在需要的时候分配,在不需要的时候自动清除变量的存储区。里面的变量通常是局部变量、函数参数等。特点:由系统的编译器自动的释放,主要用来存放方法中的参数,一些临时的局部变量等,并且方法中的参数一般在操作完后,会由编译器自动的释放掉。
堆区:
用于动态内存分配。一般由程序员手动分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收。此区域主要用来存放我们动态创建的对象、动态的申请的临时空间等。如程序在运行用malloc或new申请任意内存,程序员自己负责在何处用free或delete释放内存。该动态内存的生存期由我们决定。
数据区(静态区,全局区)
静态变量和全局变量的存储区域是一起的,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放。根据名称我们就应该知道用来存放一些全局的东西,比如我们经常用到的静态变量、全局变量等都会存放到数据区,此区域上的东西都被全局所共享。比如我们可以采取类名.的方式就可以访问到方法,这就是所谓的静态方法,存放到数据区的。const跟非const存储上没区别,只不过是read only的,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
代码区:
就是存放你的程序的编译后的可执行代码的地方了,CPU执行的机器指令,并且是只读的。存放代码(如函数),不允许修改(类似常量存储区),但可以执行(不同于常量存储区)。
常量存储区:
这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
自由存储区:
自由存储是C++中通过new与delete动态分配和释放对象的抽象概念,自由存储区和堆不是一个概念。一般而言,自由存储区是指CRT(C运行时库)通过malloc,free函数管理的内存。堆特指通过new,delete管理的内存。但是在部分编译器的实现上这两块内存都是同一种管理方式。但是在c++情况下是不区分的,自己找资料查询的。