内存溢出是指程序在申请内存时,系统并没有给足够的内存来供其使用,OUT OF MEMORY。
内存泄漏是自己向系统申请了内存空间但是使用完之后没有释放掉,结果那块内存自己不能使用,系统也不能在分配给其他程序再使用了。
一次内存泄漏可以忽略,但是多次的内存泄漏终将导致内存溢出。
内存泄漏可以分为4种:
1.常发性内存泄漏,发生内存泄漏的代码会被多次访问到,每次被执行的时候都会导致一块内存泄漏。
2.偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定环境下,偶发性的也许就变成了常发性的。所以测试环境和测试环境对检测内存泄漏至关重要。
3.一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放内核,所以内存泄漏只会发生一次。
4.隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以我们称这类内存泄漏为隐式内存泄漏。
内存越界是指程序申请了一段内存,但是在运行的过程中实质运行的空间大于申请的内存的大小。
缓冲区溢出:
缓冲区溢出是指当计算机向缓冲区填充数据位数时超过了缓冲区内存的容量溢出的数据覆盖在合法数据上,理想的情况时程序检查数据长度并不允许输入超过缓冲区长度的字符,但是大多数程序都会假设数据长度总是与分配的内存空间相匹配,这就是为缓冲区溢出埋下隐患,操作系统所使用的缓冲区,又被称为“堆栈“.在各个操作程序之间,指令会被临时存储在”堆栈“中,”堆栈“也会出现缓冲区溢出。
栈溢出:
栈溢出就是缓冲区溢出的一种。由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常这些空间为缓冲区。如果向缓冲区写入超过其本身长度的数据,以至于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象被称为缓冲区溢出
栈溢出就是缓冲区溢出的一种。