请你说一说C++的内存管理是怎样的?
栈区:主要用来存放函数的参数以及局部变量。栈区由系统进行内存管理,在函数完成执行时,系统会自行释放栈区的内存,而不需要用户参与管理
堆区:由用户手动申请,手动释放。如:malloc/free开辟内存的空间,从低地址向高地址增长。
自由存储区:就是由new/delete开辟内存空间。
通常认为C++中有两个动态内存区域。通过new/delete方式进行内存资源的分配和释放的称为自由存储区(free store),而通过malloc/free方式进行内存资源的分配和释放的称为堆区(heap)。
本质上来说很多编译器中的new操作符是通过malloc进行内存申请的,因此可以将堆区理解为自由存储区的一个具体实现,虽然二者不完全相同,但很多时候可以混为一谈。
全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
注意:
在C语言中,初始化的全局变量和静态变量放在一块内存区域中,而未初始化的全局变量和静态变量放在与之相邻的另一块内存区域中。而在C++中则没有在静态区中将初始化的和未初始化的变量进行分开存储,因为C++会对未初始化的全局变量和静态变量进行默认初始化(一般默认初始化为0)。该区域存储的数据会在程序结束后由系统来释放。
常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
1、堆区 动态分配的内存,new malloc
2、栈区 局部变量 函数参数 函数返回类型
3、数据区 初始化的全局变量以及初始化的静态变量
4、bss区 未初始化的全局变量和静态变量
5、常量区 全局constant变量
6、代码区 存放代码
The memory that a program uses is typically divided into a few different areas, called segments: