記憶體洩漏及記憶體溢位

2021-08-08 03:44:14 字數 1609 閱讀 3526

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

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

2. 對於c和c++這種沒有garbage collection 的語言來講,我們主要關注兩種型別的記憶體洩漏:

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

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

3. 如何解決記憶體洩露?

記憶體洩露的問題其困難在於1.編譯器不能發現這些問題。2.執行時才能捕獲到這些錯誤,這些錯誤沒有明顯的症狀,時隱時現。3.對於手機等終端開發使用者來說,尤為困難。下面從三個方面來解決記憶體洩露:

第一,良好的編碼習慣,盡量在涉及記憶體的程式段,檢測出記憶體洩露。當程式穩定之後,在來檢測記憶體洩露時,無疑增加了排除的困難和複雜度。使用了記憶體分配的函式,要記得要使用其想用的函式釋放掉,一旦使用完畢。

heap memory:

malloc\realloc ------ free

new \new ---------- delete \delete

globalalloc------------globalfree

要特別注意陣列物件的記憶體洩漏

mypointex *pointarray =new mypointex [100];

其刪除形式為:

delete pointarray

resource leak :對於系統資源使用之前要仔細看起使用方法,防止錯誤使用或者忘記釋放掉系統資源。

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

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

常見的溢位主要有:

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

記憶體分配雖然成功,但是尚未初始化就引用它。記憶體分配成功並且已經初始化,但操作越過了記憶體的邊界。例如在使用陣列時經常發生下標「多1」或者「少1」的操作。特別是在for 迴圈語句中,迴圈次數很容易搞錯,導致陣列操作越界。

使用free 或delete 釋放了記憶體後,沒有將指標設定為null。導致產生「野指標」。程式中的物件呼叫關係過於複雜,實在難以搞清楚某個物件究竟是否已經釋放了記憶體,此時應該重新設計資料結構,從根本上解決物件管理的混亂局面。

不要忘記為陣列和動態記憶體賦初值。防止將未被初始化的記憶體作為右值使用。

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

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

記憶體洩漏 溢位

1 記憶體洩漏memory leak 是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體洩漏似乎不會有大的影響,但記憶體洩漏堆積後的後果就是記憶體溢位。2 記憶體溢位 out of memory 指程式申請記憶體時,沒有足夠的記憶體供申請者使用,此時就會報錯oom,即所謂的記憶體溢位。重...

記憶體溢位和記憶體洩漏

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