C++内存模型
C++内存由高地址到低地址依次是栈区(向下增长,用于存放函数内的局部变量,形参和函数返回值。系统会自动管理栈区的内存分配与回收)、堆区(向上增长,由程序员主动申请和释放,容易造成内存泄漏)、静态区(也叫全局区,静态变量和全局变量的存储区域一样,静态区的内存直到程序完全结束才会被释放)、常量区(用于存放常量)、代码区(用于存放代码)
分成多个区的原因
通过对不同数据进行分类,可以方便访问、节约空间和方便管理。对于临时数据和多次使用的代码因为生命周期短,因此放入栈区。全局和静态变量可能在整个程序中都需要访问,因此需要单独管理。堆区可由用户自行分配方便管理
栈区
栈区内存由系统自动分配释放,栈区是先进后出原则,且栈区地址是向下增长的。
堆区
堆区是向上增长的,因此后申请的内存地址会依次增大
静态区(全局区)
静态全局变量、静态局部变量、全局变量都存储在静态区。若未初始化,那么系统会自动为其初始化为0。对于静态局部变量来说,多次调用函数编译器只会为第一次初始化分配内存。
常量区
用于存储常量,不可被修改。举个例子:
char *p = "abc";
//此时指针变量p存储在栈区,而它指向存储在常量区的字符串常量"a