缓冲区溢出
缓冲区溢出是指当计算机向缓冲区内填充的数据位数超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。
缓冲区溢出可能会造成严重的危害:如果被覆盖的数据可能永远丢失,如果被覆盖的数据是非常重要的数据,那么结果可想而知。但是如果覆盖的数据是无用的,那么并不会造成影响。
举个例子来说,你为你的家人在一辆车上定了四个位置 ,但是现在你有五个家人上车。这样一来会有两种情况:
1.你第五个家人做的位置原本没人坐
2.你第五个家人把另一个人赶下车,然后坐了他的位置。
1>被你赶下车的人是我,问题不大,我也不会把你怎么样(覆盖无用数据)。
2>被你赶下车的是周姐,问题大了,他可能会问候你的家人(覆盖重要数据)。
具体来说,缓冲区溢出可分为堆缓冲区溢出和栈缓冲区溢出
栈缓冲区溢出
栈中存放的多是一些子函数的调用信息。如果溢出,可能会覆盖掉一些子函数调用的参数,那么就会导致程序无法从子函数中返回
堆缓冲区溢出
堆中是对内存的分配,会有一些重要的数据,如果溢出,那么这些数据可能会被覆盖,使得程序无法正常运行
内存溢出
内存溢出就是你要求分配的内存超出了系统能给你的内存,系统不能满足需求,于是产生溢出。
举个例子来说,你爸有100万,但是问你爸要1000万,你爸给不起。
内存泄漏
内存泄漏是指你向系统申请分配内存进行使用(malloc, new),可是使用完了以后却不归还(free),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了,或许是不想再用了),而系统也不能再次将它分配给需要的程序。
举个例子来说,你找你爸借了10辆劳斯莱斯,用完了,没还给你爸。
内存泄漏堆积会导致内存溢出
还是上面的例子,你找你爸借了10辆劳斯莱斯,用完了,没还给你爸,但是你也不再开了。过了两天,你又找你爸借十辆劳斯莱斯,用完了,又没还,但是你也不再开了(内存泄漏堆积)。又过了两天,你又找你爸借10辆劳斯莱斯,你爸说只有1辆了(内存溢出)。