栈内存与堆内存的简单比较

数据区介绍
存储函数参数和局部变量,由编译器负责分配和回收,存储数据采用先进后出的方式
存储动态分配的内存块,该空间由程序员负责分配和回收
全局及静态存储区存储全局变量和静态变量,生命周期在程序运行时始终存在,在程序结束时系统才回收这部分空间
常量存储区(字符串常量区)存放字符串常量

堆空间和栈空间的区别

存储函数参数和局部变量,由系统管理存储动态分配的内存块,由程序员管理
先进后出的数据结构,可用空间永远是一块连续的区域在不断分配和释放的过程中,造成可用空间碎片化
默认大小只有几M,向着内存地址减小的方向消耗空间理论大小几个G,向着内存地址增大的方向消耗空间
有计算机底层的支持,压栈和出栈有专门的指令,效率高效率相对较低

递归程序的潜在风险
虽然递归函数书写简单,可读性强,当递归层数过深时,有可能发生栈溢出;可以用循环结构代替递归,但代码因此变长,可读性降低。

内存泄漏
由于程序中通过malloc或者new从堆中申请一块空间,但是使用后没有free或delete
预防内存泄漏
1、使用智能指针代替普通指针(智能指针自带引用计数功能,会调用析构函数释放空间)
2、内存泄测工具(Memcheck)
3、编程习惯

内存越界
访问了申请空间之外的内存
如:

char a[8];
memset(a,0,16);

数组a占8个字节,memset想清除数组a首地址之后的16个字节,发生了越界。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值