欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

栈内存与堆内存

程序员文章站 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个字节,发生了越界。

相关标签: 内存