記憶體洩漏(memory leak)和記憶體溢位

2022-01-31 10:01:36 字數 981 閱讀 1884

1. 什麼是記憶體洩漏(memory leak)?

指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。記憶體洩漏並非指內存在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。

2. 兩種型別的記憶體洩漏:

堆記憶體洩漏(heap leak)。對記憶體指的是程式執行中根據需要分配通過malloc,realloc new等從堆中分配的一塊記憶體,再是完成後必須通過呼叫對應的 free或者delete 刪掉。如果程式的設計的錯誤導致這部分記憶體沒有被釋放,那麼此後這塊記憶體將不會被使用,就會產生heap leak.

系統資源洩露(resource leak).主要指程式使用系統分配的資源比如 bitmap,handle ,socket等沒有使用相應的函式釋放掉,導致系統資源的浪費,嚴重可導致系統效能降低,系統執行不穩定。

在linux中 兩個檔案描述符指向乙個file。必須關閉兩次,否則會出現記憶體洩露

還有在linux中,open()以後一定要加上close()

eg:closehandle() closesocket()

記憶體洩露引出記憶體溢位話題:

所謂記憶體溢位就是你要求分配的記憶體超出了系統能給你的,系統不能滿足需求,於是會產生記憶體溢位的問題。

常見的溢位主要有:

記憶體分配未成功,卻使用了它。

常用解決辦法是,在使用記憶體之前檢查指標是否為null。如果指標p 是函式的引數,那麼在函式的入口處用assert(p!=null)進行檢查。如果是用malloc 或new 來申請記憶體,應該用if(p==null)或if(p!=null)進行防錯處理。

記憶體分配雖然成功,但是尚未初始化就引用它。

記憶體分配成功並且已經初始化,但操作越過了記憶體的邊界。

例如在使用陣列時經常發生下標「多1」或者「少1」的操作。特別是在for 迴圈語句中,迴圈次數很容易搞錯,導致陣列操作越界。

使用free 或delete 釋放了記憶體後,沒有將指標設定為null。導致產生「野指標」。

記憶體洩漏和記憶體溢位 記憶體洩漏和記憶體溢位

記憶體洩漏 是指申請的記憶體空間使用完畢之後未 一次記憶體洩露危害可以忽略,但若一直洩漏,無論有多少記憶體,遲早都會被占用光,最終導致程式crash。因此,開發中我們要盡量避免記憶體洩漏的出現 記憶體溢位 是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用。通俗理解就是記憶體不夠用了,通常在執行大...

記憶體溢位和記憶體洩漏

記憶體溢位 oom 指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現oom 記憶體洩露memory leak 指程式在申請記憶體後,無法釋放已申請的記憶體空間,一直占用著這塊記憶體空間。記憶體溢位就是你要求分配的記憶體超出了系統能給你的,系統不能滿足需求,於是產生溢位。記憶體洩漏是指你向系統...

記憶體溢位和記憶體洩漏

記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory 比如申請了乙個integer,但給它存了long才能存下的數,那就是記憶體溢位。記憶體洩露 memory leak,是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記...