栈溢出:

顾名思义:栈满了,好比已经装满水的桶,这个时候你还得往里面再加上一点,水就溢出来了,常见的栈溢出则是递归层次太深,为什么递归层次太深会导致栈溢出呢?我们知道程序分配空间的时候会给我们分配一个栈的空间供我们使用,在栈上保存了调用函数的一些信息,比如形参,以及一些其他信息,在函数退出后便将栈上空间归还。但是我们一直递归的调用,导致函数没有办法返回,也就没有办法将空间归还,一直循环下去,必定造成栈的空间使用完。

其他造成栈空间的内存使用完的情况都大体类似,都是一直在向栈申请,导致栈无法满足需求。

 内存泄漏:

     大多数说法是:内存在申请后如果没有被回收,其实个人觉得容易让人产生误解,比如对于需要连续跑几周、几个月,甚至几年的服务器来说,如果在运行期间,我们申请了内存,并且越来越多,我们等到程序关闭的时候再来释放我们申请的内存,严格意义上来说,我没有泄漏啊,我最后都释放了啊,可是随着运行时间的增长,内存会消耗殆尽,程序崩了是不是觉得很意外、很惊喜、so 应该说:内存在申请后没有被及时释放,至于什么时候算及时,个人觉得应该在使用完之后应该立即释放。如果你说你就是要频繁的申请内存,程序结束前才能做释放,额。。。不知道是否有这样的需求,至少我还没遇到。

根据网上的一些大神总结的归纳下:

1、常发性内存泄漏:经常性的申请内存,但是没有释放

2、偶发性内存泄漏:偶尔性的申请却不释放,其实跟常发性一样,只是频率而已。

3、一次性内存泄漏:只会发生一次,比如在构造函数中申请,而且这个对象只实例化一个。

4、隐式内存泄漏:就是我们说的,运行期间申请,但是程序结束前才释放。

内存泄漏其实绝大多数并不能影响到用户,但是内存堆积才是万恶之源。

内存越界:

比如你买了一条街上的100号到120号的房子,你在100到120之间的房子随便折腾,这个是你的权力,因为这个是你的房子,但是某一天,你说你要跑到121房子去住,你看别人不打死你,因为你访问了不属于你的空间。最常见的就是数组的越界,内存拷贝等内存操作函数。

缓冲区溢出:

栈溢出就是缓冲区溢出的一种,就是往缓冲区写入太多东西