C 記憶體洩漏型別

2021-06-29 06:54:07 字數 1395 閱讀 6257

在電腦科學中,記憶體洩漏(memory leak)指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。記憶體洩漏並非指內存在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。記憶體洩漏與許多其他問題有著相似的症狀,並且通常情況下只能由那些可以獲得程式源**的程式設計師才可以分析出來。然而,有不少人習慣於把任何不需要的記憶體使用的增加描述為記憶體洩漏,嚴格意義上來說這是不準確的。   

一般我們常說的記憶體洩漏是指堆記憶體的 洩漏。堆記憶體是指程式從堆中分配的,大小任意的(記憶體塊的大小可以在程式執行期決定),使用完後必須顯式釋放的記憶體。應用程式一般使用 malloc,calloc,realloc等函式(c++中使用new操作符)從堆中分配到一塊記憶體,使用完後,程式必須負責相應的呼叫free或 delete釋放該記憶體塊,否則,這塊記憶體就不能被再次使用,我們就說這塊記憶體洩漏了。

記憶體洩漏分類

1. 常發性記憶體洩漏。發生記憶體洩漏的**會被多次執行到,每次被執行的時候都會導致一塊記憶體洩漏。   

2. 偶發性記憶體洩漏。發生記憶體洩漏的**只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測記憶體洩漏至關重要。   

3. 一次性記憶體洩漏。發生記憶體洩漏的**只會被執行一次,或者由於演算法上的缺陷,導致總會有一塊且僅一塊記憶體發生洩漏。比如,在乙個singleton類的建構函式中分配記憶體,在析構函式中卻沒有釋放該記憶體。而singleton類只存在乙個例項,所以記憶體洩漏只會發生一次。   

4. 隱式記憶體洩漏。程式在執行過程中不停的分配記憶體,但是直到結束的時候才釋放記憶體。嚴格的說這裡並沒有發生記憶體洩漏,因為最終程式釋放了所有申請的記憶體。但 是對於乙個伺服器程式,需要執行幾天,幾周甚至幾個月,不及時釋放記憶體也可能導致最終耗盡系統的所有記憶體。所以,我們稱這類記憶體洩漏為隱式記憶體洩漏。

記憶體洩漏會因為減少可用記憶體的數量從而降低計算機的效能。最終,在最糟糕的情況下,過多的可用記憶體被分配掉導致全部或部分裝置停止正常工作,或者應用程式崩潰。   

記憶體洩漏可能不嚴重,甚至能夠被常規的手段檢測出來。在現代作業系統中,乙個應用程式使用的常規內存在程式終止時被釋放。這表示乙個短暫執行的應用程式中的記憶體洩漏不會導致嚴重後果。   

在以下情況,記憶體洩漏導致較嚴重的後果:   

* 程式執行後置之不理,並且隨著時間的流失消耗越來越多的記憶體(比如伺服器上的後台任務,尤其是嵌入式系統中的後台任務,這些任務可能被執行後很多年內都置之不理)   

* 程式能夠請求未被釋放的記憶體(比如共享記憶體),甚至是在程式終止的時候   

* 洩漏在作業系統內部發生   

* 洩漏在系統關鍵驅動中發生   

* 記憶體非常有限,比如在嵌入式系統或便攜裝置中   

* 當執行於乙個終止時記憶體並不自動釋放的作業系統(比如amigaos)之上,而且一旦丟失只能通過重啟來恢復。

C 記憶體洩漏

記憶體洩漏 記憶體溢位 out of memory 通俗理解就是記憶體不夠,通常在執行大型軟體或遊戲時,軟體或遊戲所需要的記憶體遠遠超出了你主機內安裝的記憶體所承受大小,就叫記憶體溢位。記憶體洩漏 memory leak 是指程式中已動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體...

C 記憶體洩漏常見

程式中通常包含著靜態記憶體和棧記憶體。靜態記憶體用來儲存區域性static物件 類static資料成員以及定義在任何函式之外的變數 全域性變數 棧記憶體用來儲存定義在函式內的非static物件。分配在靜態或棧記憶體中的物件由編譯器自動建立和銷毀。對於棧物件,僅在定義的程式塊執行時才存在,程式退出,棧...

c 記憶體洩漏問題

記憶體洩漏 所以當程式退出時,系統會收回分配的記憶體,由於記憶體已被錯誤地釋放掉,於是就會出現 debug assertion failed 的錯誤。這個assert說明,有一塊內存在被釋放的時候,它的頭部裡面的資訊已經被改掉了,和預期的不一樣。記憶體分配的程式往往在被分配出的記憶體塊頭部放上一些校...