zoukankan      html  css  js  c++  java
  • 内存泄漏和内存溢出的区别

    原文地址https://www.zhihu.com/question/40560123

    简单来说,操作系统就像资源分配人员,你要使用内存的时候分给你,你用完了还给它。如果你使用了没有分配给你的内存就是内存溢出,如果你用完了没有还就是内存泄漏。
    会引起的问题:
    内存溢出存在的问题是你用了没有分配给你的内存,系统是不知道的,他又把内存分配给了其他程序,结果就是别人也写了或者读了这个内存。程序可能崩溃。当然也可能没问题,所以内存溢出往往不好查。
    内存泄漏的问题就比理解,你没有还给系统,系统的内存就越来越少。直到没有可用内存。

    泄漏是占着不用了,溢出是用不该用的地方;溢出一般会出事,泄漏在内存无限时不会出事。
    泄漏是说你的程序有BUG 导致内存不释放。溢出是指内存不够用了 导致不够用的原因很多 泄漏只是其中一种。

    内存泄露是指你的应用使用资源之后没有及时释放,导致应用内存中持有了不需要的资源,这是一种状态描述。
    而内存溢出是指你的应用的内存已经不能满足正常使用了,堆栈已经达到系统设置的最大值,进而导致崩溃,这事一种结果描述。
    而且通常都是由于内存泄露导致堆栈内存不断增大,从而引发内存溢出。

    所谓内存泄漏,只是一个编程习惯的问题。实际上很多内存泄漏对程序的运行不会有任何影响,有的内存泄漏,要连续不关机不重启电脑长达几十年的时间,才会被人觉察到。比如说电脑的内存有32GB,你程序分配了一块2KB的内存。而这块内存没有起任何作用,就一直放在那里。这就是内存泄漏的一种。有什么影响吗? 毫无影响。一般说内存泄漏是指分配了一块内存,用它存了一些东西,然后不再用它了,但并没有把这块内存释放掉。实际上只要程序退出了,不管泄漏不泄露,所有的内存一样会释放。内存溢出比这严重多了。比如电脑有32GB的内存,32GB全用完了,这叫内存溢出。不管内存泄漏与否,只要用了这么多内存,都会导致内存溢出。

    内存溢出,这个好理解,说明存储空间不够大。就像倒水倒多了,从杯子上面溢出了来了一样。
    内存泄漏,原理是,使用过的内存空间没有被及时释放,长时间占用内存,最终导致内存空间不足,而出现内存溢出。这个也很好理解,所谓的“泄漏”是相对释放对象来定义的,逃脱了释放对象的释放,漏处理了,也就是泄漏。形象一点理解,就是一个大的排放废水的池子,你用水瓢(相当于释放对象)瓢水,但是水瓢有个洞,漏了。

    泄漏就是内存申请后,用完没有释放,造成可用内存越来越少。
    溢出指用户实际的数据长度超过了申请的内存空间大小,导致覆盖了其他正常数据,容易造成程序异常,严重的,攻击者可以以此获取程序控制权。

    内存泄露:用完扔了,没有归还。
    内存溢出:霸占不属于你的资源。
  • 相关阅读:
    POJ 1703 Find them, Catch them
    POJ 2236 Wireless Network
    POJ 2010 Moo University
    POJ 2184 Cow Exhibition
    POJ 3280 Cheapest Palindrome
    POJ 3009 Curling 2.0
    POJ 3669 Meteor Shower
    POJ 2718 Smallest Difference
    POJ 3187 Backward Digit Sums
    POJ 3050 Hopscotch
  • 原文地址:https://www.cnblogs.com/liqing168/p/12449839.html
Copyright © 2011-2022 走看看