有关 内存溢出、泄露、越界、缓冲区溢出、栈溢出

前言:借鉴学习+自我理解。若是有不恰当的地方,希望大家可以不吝赐教。
--------------------------------------------------------------------------------------------------------------------------------------------------------
内存溢出( out of memory):是指程序在申请内存时,没有足够的内存空间供其使用(也可以理解我们 要求分配的内存超出了系统能给的,系统不能满足需求 ),所以出现out of memory;比如系统只能存放integer的空间,而你却申请了存放long,于是引起内存溢出
打个比方:一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出!比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。

内存泄露(memory leak):向系统申请分配内存时使用(new),但是使用完后不归还(delete),使得申请到的那块内存你自己也不能再访问了(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。
打个比方:向朋友借了一支笔,用后却没有归还(也许你不知道把它丢哪了),导致朋友以后都不能再把这支笔借给有需要的人了。

以发生的方式来分类,内存泄漏可以分为4 类:
1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。

2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。

3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。

4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是 内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害 性则非常大,因为较之于常发性和偶发性内存,泄漏它更难被检测到。

注意:memory leak 发生多了最终会导致out of memory。

内存越界:向系统申请了一块内存,而在使用内存时,超出了申请的范围常见的有使用特定大小数组时发生内存越界
例如 :
        string str = "this is a test string!!!!";
        char buf[16] = {0};
        strcpy(buf, str.c_str()); //out of buffer space  将str字符串中到'\0'结束前的25个字符(含空格哦)复制到只能容下16个字符的buf数组中,结果导致内存越界
         

注意:内存越界跟内存溢出的区别,前者是在使用系统提供的内存时,做了一些超出申请的内存范围的操作;而后者则是在申请内存大小时就已超出系统能提供的。

缓冲区溢出: 当计算机向缓冲区内填充数据位数时,超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上
操作系统所使用的缓冲区又被称为"堆栈". 在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。
注意:缓冲区溢出和内存溢出的区别,前者是溢出后的数据会覆盖到计算机内存中以前的内容。除非这些被覆盖的内容被保存或能够恢复,否则就会永远丢失。黑客入侵的一种就是用精心编写的入侵代码(一种恶意程序)使缓冲区溢出,然后用自己预设的方法处理缓冲区,并且执行,从而达到入侵操纵。这就好像不仅仅是沙暴吹了脚印,而且后来者也会踩出新的脚印,将我们的迷路者领向不同的地方,他自己一无所知的地方。而后者内存溢出是系统自身内存有限无法满足申请需求。

栈溢出: 栈溢出就是缓冲区溢出的一种。 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这 些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。


致谢以下参考来源:
























  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值