C++的内存分为:堆、栈、自由存储区、全局/静态存储区、常量存储区。
全局变量、static全局变量、static局部变量时存放在全局/静态存取区的,是在程序编译的时候,就在全局存储区分配内存的,生存期为整个程序运行,直至运行结束才会被系统回收。
全局变量和static全局变量的区别在于作用域,全局变量可以在其他文件中应用,加上extern关键字即可;但是static全局变量只作用于当前文件中。
static局部变量的生存期也是这个程序运行期,但是作用域还是局部的,只是作用域代码段执行完之后程序不会释放内存,也不会在下一次执行的时候再次分配内存。
局部变量在程序运行时被创建,分配的是栈中的内存,随着程序的执行,一旦局部变量的作用域代码段运行结束,系统会自动释放内存,并且在下一次运行时会重新分配。
常量存储区存储字符串等常量,生存期是整个程序运行期,作用域看定义在哪里,当程序运行结束时这块存储区会被释放。
在C++中,由new和delete关键字来申请和释放的内存区域称为自由存储区,当这块自由存储区是由堆实现的时候,可以说new所申请的内存区域在堆上。其实堆是C语言和操作系统的术语,是操作系统维护的一块内存,而自由存储区是C++中通过new和delete动态分配和释放对象的抽象概念。堆和自由存储区并不等价。堆的内存申请和释放由编程者控制,因此比较危险,处理不当容易产生内存泄露;而栈是由编译器自动管理的,无需我们手动控制。