内存区域
- C++内存分为5个区域,堆区、栈区、全局/静态存储区、常量存储区、代码区
栈区
- 是由编译器在需要的时候分配,也由编译器自动释放的区域。用来存放局部变量,函数参数等。存放在栈区的数据只在当前函数或者下一层函数有效,一旦函数返回了,数据就释放了。
堆区
- 这是C的说法,在C++应该说是自由存储区,只不过默认是堆区,也可能是内存池这就涉及到分配器和我们自己设置的内存管理的问题了。堆区是由new来分配内存块的,但是编译器不会管理内存块的释放,需要使用者自行delete,如果没有释放则会造成内存泄漏,或者在程序结束时由系统自动回收。
全局/静态存储区
- 用来存放全局变量或者静态变量的,里面具体也有两个部分,初始化过的放在一起.data段,而没有初始化的放在一起.bss段,这部分在程序运行前会清零,也就是你没有初始化的全局变量,其实编译器也会帮你初始化为0,另外静态成员变量在初始化以前是没有分配内存的。
常量只读区
- 存放全局的const常量,这个数据区里的东西是不允许修改,虚函数表的存放位置也就是常量区,这一点可以通过VS调试看到虚函数指针指向的地址就在常量区。另外局部的const常量本质还是变量,是存放在栈上的,虽然也是只读,但是还是有特殊手段可以修改的,虽然没什么意义。
代码段
- 存放代码,比如函数的地方。
堆和栈的区别
- 管理方式
- 堆需要用户手动申请手动释放,容易产生内存泄漏
- 栈由系统自动分配自动回收,
- 大小和生长方向不同
- 堆地址由下向上生长,栈由上往下。堆的空间比栈大得多,32位上堆的内存能到4G,window的默认栈大小应该是1M
- 碎片产生
- 堆中内存的分配和释放会产生内存碎片,而栈因为后进先出的机制,不会产生内存碎片