C++内存管理
C++中,内存分为5个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。
- 栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存局部变量、函数参数、函数返回值等。大小可以由编译器决定,一般为2M。
- 栈:由程序员手动申请和释放的内存块,一般用new或者malloc申请内存,用delete或free释放。如果程序员没有释放会导致内存泄漏,内存资源将在程序结束后自动回收。一般大小为4G。
- 自由存储区:
- 全局/静态存储区:存放全局变量和静态变量的内存单元。
- 常量存储区:是一块特殊的存储区,用来存放常量,不允许修改。
堆和栈的区别(常考)
堆 | 栈 | |
---|---|---|
管理方式 | 由程序员控制 | 编译器自动管理 |
系统响应 | 遍历记录空闲内存地址的链表,寻找第一个大于所申请空间的节点,进行内存分配 | 不超出栈的剩余空间,系统自动分配 |
空间大小 | 4G(具体看情况) | 2M,有的IDE可以设置 |
碎片问题 | 容易产生内存碎片 | 先进后出,不会产生碎片 |
生长方向 | 向高地址增长 | 向低地址增长 |
分配方式 | 动态分配 | 静态分配和动态分配(编译器自动释放) |
分配效率 | 效率低 | 效率高 |
堆栈溢出
(1)函数调用层次太深或数组开的太大—栈溢出
(2)动态申请空间后没后释放
(3)数组访问越界。
(4)指针非法访问。
指针(c++的灵魂)
指针:
引用&#