1. 程式人生 > >記憶體洩露和記憶體溢位

記憶體洩露和記憶體溢位

一、記憶體洩露
1.定義:指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。記憶體洩漏並非指記憶體在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。
2.洩露型別:
1>堆記憶體洩漏(Heap leak)
a.指利用malloc或new進行堆記憶體分配後,沒有及時採用free或者delete釋放記憶體,從而導致這個記憶體不能使用,出現記憶體洩露
2>系統資源洩露(Resource Leak)
a.指程式使用系統分配的資源比如 Bitmap,handle ,SOCKET等沒有使用相應的函式釋放掉,導致系統資源的浪費,嚴重可導致系統效能降低,系統執行不穩定
3.如何解決
1>良好的程式設計習慣,malloc和free,new和delete配對使用
2>過載  new 和 delete

二、記憶體溢位
1.定義:記憶體溢位就是你要求分配的記憶體超出了系統能給你的,系統不能滿足需求,於是會產生記憶體溢位的問題
2.溢位型別:
1>記憶體分配未成功,卻使用了它
a.用if(p==NULL)或if(p!=NULL)進行防錯處理
2>記憶體分配雖然成功,但是尚未初始化就引用它
a.記憶體在分配完成之後,記得初始化
3>記憶體分配成功並且已經初始化,但操作越過了記憶體的邊界
a.如在使用陣列時經常發生下標“多1”或者“少1”的操作。特別是在for 迴圈語句中,迴圈次數很容易搞錯,導致陣列操作越界
4>使用free 或delete 釋放了記憶體後,沒有將指標設定為NULL。導致產生“野指標”
a.故釋放之後一定要指向NULL