在計算機科學(xué)中,內(nèi)存泄漏(memory leak)指由于疏忽或錯誤使程序未能釋放而造成不能再使用的內(nèi)存的情況。內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計錯誤,失去了對該段內(nèi)存的控制,因而造成了內(nèi)存的浪費。內(nèi)存泄漏與許多其他問題有著相似的癥狀,并且通常情況下只能由那些可以獲得程序源代碼的程序員才可以分析出來。然而,有不少人習慣于把任何不需要的內(nèi)存使用的增加描述為內(nèi)存泄漏,嚴格意義上來說這是不準確的。
一般我們常說的內(nèi)存泄漏是指堆內(nèi)存的泄漏。堆內(nèi)存是指程序從堆中分配的,大小任意的(內(nèi)存塊的大小可以在程序運行期決定),使用完后必須顯式釋放的內(nèi)存。應(yīng)用程序一般使用malloc,calloc,realloc等函數(shù)(C++中使用new操作符)從堆中分配到一塊內(nèi)存,使用完后,程序必須負責相應(yīng)的調(diào)用free或delete釋放該內(nèi)存塊,否則,這塊內(nèi)存就不能被再次使用,我們就說這塊內(nèi)存泄漏了。
常見內(nèi)存泄漏:
1. 常發(fā)性內(nèi)存泄漏。發(fā)生內(nèi)存泄漏的代碼會被多次執(zhí)行到,每次被執(zhí)行的時候都會導(dǎo)致一塊內(nèi)存泄漏。
2. 偶發(fā)性內(nèi)存泄漏。發(fā)生內(nèi)存泄漏的代碼只有在某些特定環(huán)境或操作過程下才會發(fā)生。常發(fā)性和偶發(fā)性是相對的。對于特定的環(huán)境,偶發(fā)性的也許就變成了常發(fā)性的。所以測試環(huán)境和測試方法對檢測內(nèi)存泄漏至關(guān)重要。
3. 一次性內(nèi)存泄漏。發(fā)生內(nèi)存泄漏的代碼只會被執(zhí)行一次,或者由于算法上的缺陷,導(dǎo)致總會有一塊且僅一塊內(nèi)存發(fā)生泄漏。比如,在一個Singleton類的構(gòu)造函數(shù)中分配內(nèi)存,在析構(gòu)函數(shù)中卻沒有釋放該內(nèi)存。而Singleton類只存在一個實例,所以內(nèi)存泄漏只會發(fā)生一次。
4. 隱式內(nèi)存泄漏。程序在運行過程中不停的分配內(nèi)存,但是直到結(jié)束的時候才釋放內(nèi)存。嚴格的說這里并沒有發(fā)生內(nèi)存泄漏,因為最終程序釋放了所有申請的內(nèi)存。但是對于一個服務(wù)器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內(nèi)存也可能導(dǎo)致最終耗盡系統(tǒng)的所有內(nèi)存。所以,我們稱這類內(nèi)存泄漏為隱式內(nèi)存泄漏。
如果一個程序存在內(nèi)存泄漏并且它的內(nèi)存使用量穩(wěn)定增長,通常不會有很快的癥狀。每個物理系統(tǒng)都有一個較大的內(nèi)存量,如果內(nèi)存泄漏沒有被中止(比如重啟造成泄漏的程序)的話,它遲早會造成問題。
-
內(nèi)存
+關(guān)注
關(guān)注
9文章
3211瀏覽量
76377 -
內(nèi)存泄漏
+關(guān)注
關(guān)注
0文章
41瀏覽量
9520
發(fā)布評論請先 登錄
keil中c語言的動態(tài)分配內(nèi)存
化工廠液體泄漏識別預(yù)警系統(tǒng)
三種類型內(nèi)存的使用
內(nèi)存與數(shù)據(jù)處理優(yōu)化藝術(shù)
WebGL/Canvas 內(nèi)存泄露分析
at_device 包 ml307長時間運行有內(nèi)存泄漏問題怎么解決?
變壓器常見類型及特點詳解
在OpenVINO? C++代碼中啟用 AddressSanitizer 時的內(nèi)存泄漏怎么解決?
HarmonyOS優(yōu)化應(yīng)用內(nèi)存占用問題性能優(yōu)化四
簡述不同類型接地電阻柜及其特點
HarmonyOS優(yōu)化應(yīng)用內(nèi)存占用問題性能優(yōu)化一
推薦兩款菲力爾氣體泄漏檢測神器
快速搞懂C語言程序內(nèi)存分區(qū)!
內(nèi)存泄漏的特點和類型
評論