內存洩漏是指分配出去的內存無法回收了
內存洩漏指由於疏忽或錯誤造成程序未能釋放已經不再使用的內存的情況,是應用程序分配某段內存後,由於設計錯誤,失去了對該段內存的控制,因而造成了內存的浪費。
一般我們常說的內存洩漏是指堆內存的洩漏。堆內存是指程序從堆中分配的,大小任意的(內存塊的大小可以在程序運行期決定),使用完後必須顯示釋放的內存。應用程序一般使用malloc,realloc,new等函數從堆中分配到一塊內存,使用完後,程序必須負責相應的調用free或delete釋放該內存塊,否則,這塊內存就不能被再次使用,我們就說這塊內存洩漏了。
下面給出了一個簡單的內存洩露的例子。在這個例子中,我們循環申請Object對象,並將所申請的對象放入一個Vector中,如果我們僅僅釋放引用本身,那麼Vector仍然引用該對象,所以這個對象對GC來說是不可回收的。因此,如果對象加入到Vector後,還必須從Vector中刪除,最簡單的方法就是將Vector對象設置為null。
Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
Object o=new Object();
v.add(o);
o=null;
}
內存溢出是指程序要求的內存,超出了系統所能分配的范圍,從而發生溢出。
內存溢是指在一個域中輸入的數據超過它的要求而且沒有對此作出處理引發的數據溢出問題,多余的數據就可以作為指令在計算機上運行。
內存洩漏指由於疏忽或錯誤造成程序未能釋放已經不再使用的內存的情況。內存洩漏並非指內存在物理上的消失,而是應用程序分配某段內存後,由於設計錯誤,失去了對該段內存的控制,因而造成了內存的浪費。內存洩漏與許多其他問題有著相似的症狀,並且通常情況下只能由那些可以獲得程序源代碼的程序員才可以分析出來。然而,有不少人習慣於把任何不需要的內存使用的增加描述為內存洩漏,即使嚴格意義上來說這是不准確的。
一般我們常說的內存洩漏是指堆內存的洩漏。堆內存是指程序從堆中分配的,大小任意的(內存塊的大小可以在程序運行期決定),使用完後必須顯示釋放的內存。應用程序一般使用malloc,realloc,new等函數從堆中分配到一塊內存,使用完後,程序必須負責相應的調用free或delete釋放該內存塊,否則,這塊內存就不能被再次使用,我們就說這塊內存洩漏了。
內存洩漏可以分為4類:
1. 常發性內存洩漏。發生內存洩漏的代碼會被多次執行到,每次被執行的時候都會導致一塊內存洩漏。
2. 偶發性內存洩漏。發生內存洩漏的代碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測內存洩漏至關重要。
3. 一次性內存洩漏。發生內存洩漏的代碼只會被執行一次,或者由於算法上的缺陷,導致總會有一塊僅且一塊內存發生洩漏。比如,在類的構造函數中分配內存,在析構函數中卻沒有釋放該內存,所以內存洩漏只會發生一次。
4. 隱式內存洩漏。程序在運行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這裡並沒有發生內存洩漏,因為最終程序釋放了所有申請的內存。但是對於一個服務器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內存也可能導致最終耗盡系統的所有內存。所以,我們稱這類內存洩漏為隱式內存洩漏。
簡單點:
內存洩漏就是忘記釋放使用完畢的內存,讓下次使用有一定風險。
內存溢出就是一定的內存空間不能裝下所有的需要存放的數據,造成內存數據溢出。