栈内存与堆内存
程序员文章站
2022-06-03 22:47:16
...
数据区 | 介绍 |
---|---|
栈 | 存储函数参数和局部变量,由编译器负责分配和回收,存储数据采用先进后出的方式 |
堆 | 存储动态分配的内存块,该空间由程序员负责分配和回收 |
全局及静态存储区 | 存储全局变量和静态变量,生命周期在程序运行时始终存在,在程序结束时系统才回收这部分空间 |
常量存储区(字符串常量区) | 存放字符串常量 |
堆空间和栈空间的区别
堆 | 栈 |
---|---|
存储函数参数和局部变量,由系统管理 | 存储动态分配的内存块,由程序员管理 |
先进后出的数据结构,可用空间永远是一块连续的区域 | 在不断分配和释放的过程中,造成可用空间碎片化 |
默认大小只有几M,向着内存地址减小的方向消耗空间 | 理论大小几个G,向着内存地址增大的方向消耗空间 |
有计算机底层的支持,压栈和出栈有专门的指令,效率高 | 效率相对较低 |
递归程序的潜在风险
虽然递归函数书写简单,可读性强,当递归层数过深时,有可能发生栈溢出;可以用循环结构代替递归,但代码因此变长,可读性降低。
内存泄漏
由于程序中通过malloc或者new从堆中申请一块空间,但是使用后没有free或delete
预防内存泄漏
1、使用智能指针代替普通指针(智能指针自带引用计数功能,会调用析构函数释放空间)
2、内存泄测工具(Memcheck)
3、编程习惯
内存越界
访问了申请空间之外的内存
如:
char a[8];
memset(a,0,16);
数组a占8个字节,memset想清除数组a首地址之后的16个字节,发生了越界。
上一篇: 记一次内存撑爆故障分析