• 栈区(stack area): 由编译器管理内存的申请和释放, 一般来说函数的局部变量、函数形参都存放在栈区
  • 堆区(heap area): 由程序员管理, 需要手动释放内存.
  • 自由存储区: 用 new 操作符申请的内存均存储在自由存储区
  • 全局数据区: 由静态区和常量区组成
    • 静态区:存放静态变量
    • 常量区: 存储常量
  • 代码区: 存放程序的二进制代码.
  • 在栈与堆之间有部分动态分配的姑且称之为共享区,叫法可能不一样

02d3fe27e753394ffa22319a1c4e263c.png

参考:浅谈c++内存布局


0.1 追问:自由存储区与堆区有什么区别?

malloc在堆上分配的内存块,使用free释放内存,而new所申请的内存则是在自由存储区上,使用delete来释放。

0.2 追问:自由存储区与堆区是两块不同的内存区域吗?

  • 自由存储是C++中通过new与delete动态分配和释放对象的抽象概念,而堆(heap)是C语言和操作系统的术语,是操作系统维护的一块动态分配内存。
  • new所申请的内存区域在C++中称为自由存储区。藉由堆实现的自由存储,可以说new所申请的内存区域在堆上。

因此堆与自由存储区还是有区别的,它们并非等价。

参考:c++自由存储区是否等价于堆?