內存泄漏和內存溢出的區別


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

簡單來說,操作系統就像資源分配人員,你要使用內存的時候分給你,你用完了還給它。如果你使用了沒有分配給你的內存就是內存溢出,如果你用完了沒有還就是內存泄漏。
會引起的問題:
內存溢出存在的問題是你用了沒有分配給你的內存,系統是不知道的,他又把內存分配給了其他程序,結果就是別人也寫了或者讀了這個內存。程序可能崩潰。當然也可能沒問題,所以內存溢出往往不好查。
內存泄漏的問題就比理解,你沒有還給系統,系統的內存就越來越少。直到沒有可用內存。

泄漏是占着不用了,溢出是用不該用的地方;溢出一般會出事,泄漏在內存無限時不會出事。
泄漏是說你的程序有BUG 導致內存不釋放。溢出是指內存不夠用了 導致不夠用的原因很多 泄漏只是其中一種。

內存泄露是指你的應用使用資源之后沒有及時釋放,導致應用內存中持有了不需要的資源,這是一種狀態描述。
而內存溢出是指你的應用的內存已經不能滿足正常使用了,堆棧已經達到系統設置的最大值,進而導致崩潰,這事一種結果描述。
而且通常都是由於內存泄露導致堆棧內存不斷增大,從而引發內存溢出。

所謂內存泄漏,只是一個編程習慣的問題。實際上很多內存泄漏對程序的運行不會有任何影響,有的內存泄漏,要連續不關機不重啟電腦長達幾十年的時間,才會被人覺察到。比如說電腦的內存有32GB,你程序分配了一塊2KB的內存。而這塊內存沒有起任何作用,就一直放在那里。這就是內存泄漏的一種。有什么影響嗎? 毫無影響。一般說內存泄漏是指分配了一塊內存,用它存了一些東西,然后不再用它了,但並沒有把這塊內存釋放掉。實際上只要程序退出了,不管泄漏不泄露,所有的內存一樣會釋放。內存溢出比這嚴重多了。比如電腦有32GB的內存,32GB全用完了,這叫內存溢出。不管內存泄漏與否,只要用了這么多內存,都會導致內存溢出。

內存溢出,這個好理解,說明存儲空間不夠大。就像倒水倒多了,從杯子上面溢出了來了一樣。
內存泄漏,原理是,使用過的內存空間沒有被及時釋放,長時間占用內存,最終導致內存空間不足,而出現內存溢出。這個也很好理解,所謂的“泄漏”是相對釋放對象來定義的,逃脫了釋放對象的釋放,漏處理了,也就是泄漏。形象一點理解,就是一個大的排放廢水的池子,你用水瓢(相當於釋放對象)瓢水,但是水瓢有個洞,漏了。

泄漏就是內存申請后,用完沒有釋放,造成可用內存越來越少。
溢出指用戶實際的數據長度超過了申請的內存空間大小,導致覆蓋了其他正常數據,容易造成程序異常,嚴重的,攻擊者可以以此獲取程序控制權。

內存泄露:用完扔了,沒有歸還。
內存溢出:霸占不屬於你的資源。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM