區別:記憶體溢出是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用, 系統已經不能再分配出你所需要的空間;記憶體外洩是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體外洩危害可以忽略,但是記憶體洩漏次數多了就會導致記憶體溢位。
本文操作環境:windows7系統、Dell G3電腦。
記憶體溢位(out of memory),是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;例如申請了一個integer,但給它存了long才能存下的數,那就是記憶體溢位。
記憶體洩漏(memory leak),是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體外洩危害可以忽略,但記憶體外洩堆積後果很嚴重,無論多少內存,遲早會被佔光。
memory leak會最終會導致out of memory!
記憶體溢出就是你要求分配的記憶體超出了系統能給你的,系統不能滿足需求,於是產生溢出。
記憶體洩漏是指你向系統申請分配記憶體進行使用(new),可是使用完了以後卻不歸還(delete),結果你申請到的那塊記憶體你自己也不能再存取(也許你把它的地址弄丟了),而係統也不能再次將它分配給需要的程式。一個盤子用盡各種方法只能裝4個果子,你裝了5個,結果掉倒地上不能吃了。這就是溢出!比方說棧,棧滿時再做進棧必產生空間溢出,叫上溢,棧空時再做退棧也產生空間溢出,稱為下溢。就是分配的記憶體不足以放下資料項目序列,稱為記憶體溢出.
#以發生的方式來分類,記憶體洩漏可以分為4類:
1、常性記憶體洩漏。發生記憶體洩漏的程式碼會被執行多次,每次執行的時候都會導致一塊記憶體洩漏。
2、偶發性記憶體洩漏。發生記憶體洩漏的程式碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常性的。所以測試環境和測試方法對檢測記憶體洩漏至關重要。
3、一次記憶體洩漏。發生記憶體洩漏的程式碼只會被執行一次,或者由於演算法上的缺陷,導致總會有一塊僅且一塊記憶體發生洩漏。例如,在類別的建構函式中分配內存,在析構函式中卻沒有釋放該內存,所以記憶體洩漏只會發生一次。
4、隱含記憶體洩漏。程式在運行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這裡並沒有發生記憶體洩漏,因為最終程序釋放了所有申請的記憶體。但是對於一個伺服器程序,需要運行幾天,幾週甚至幾個月,不及時釋放記憶體也可能導致最終耗盡系統的所有記憶體。所以,我們稱這類記憶體洩漏為隱式記憶體洩漏。
從用戶使用程式的角度來看,記憶體洩漏本身不會產生什麼危害,作為一般的用戶,根本感覺不到記憶體洩漏的存在。真正有危害的是記憶體洩漏的堆積,這最終會消耗盡系統所有的記憶體。從這個角度來說,一次性內存洩漏並沒有什麼危害,因為它不會堆積,而隱式內存洩漏危害性則非常大,因為較之於常發性和偶發性內存洩漏它更難被檢測到
相關免費影片教學推薦:《程式設計影片》
以上是內存洩漏和內存溢出的區別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!