> For the complete documentation index, see [llms.txt](https://jun-wang.gitbook.io/learnjava/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jun-wang.gitbook.io/learnjava/bian-cheng-yu-yan/c++/c++-nei-cun-mo-xing.md).

# C++内存模型

## C++内存分为5个区域：

* 堆内存：由new分配的内存块，其释放编译器不去管，而是由我们程序自己控制，一个new对应一个delete。如果没有释放掉，在程序运行结束时操作系统也会自动回收。涉及的问题：缓冲区溢出，内存泄漏。
* 栈内存：在需要时分配，存放局部变量，函数参数，存放在这栈中的数据只在当前函数及下一层函数中有效，一旦函数返回了，这些数据也就自动释放掉了。
* 全局/静态存储区：全局和静态变量被分配到同一块内存中。
* 常量存储区：存放常量，不允许被修改。
* 代码区：存放代码（如函数），不允许修改，但可以执行。

## C++内存模型为：

* 自由存储区：局部非静态变量的存储区域，就是栈。
* 动态区：用operator new, malloc分配的内存，就是堆。
* 静态区：全局变量，静态变量，字符串常量存放的位置。

代码虽占内存，但不属于C++内存模型的一部分。

## 在linux系统中，程序在内存中的分布如下所示：

从 低地址-->高地址 代码区--> 全局/静态存储区-->堆--> unused -->栈-->env
