定義“內(nèi)存泄漏”的方法不止一種。特別是,“內(nèi)存泄漏”有兩個(gè)主要的定義,它們是程序員常用的。
“內(nèi)存泄漏”的第一個(gè)常用定義是,“在程序結(jié)束之前,內(nèi)存被分配,隨后未被釋放?!比欢S多程序員(正確地)認(rèn)為,符合這個(gè)定義的某些類(lèi)型的內(nèi)存泄漏實(shí)際上并不構(gòu)成任何類(lèi)型的問(wèn)題,因此不應(yīng)該考慮。千真萬(wàn)確“記憶泄漏”。
可以說(shuō),“內(nèi)存泄漏”的一個(gè)更嚴(yán)格(也更有用)的定義是,“內(nèi)存被分配了,并且不可能隨后釋放,因?yàn)槌绦虿辉儆兄赶蛞逊峙鋬?nèi)存塊的指針?!皳Q句話說(shuō),您不能釋放不再有指針的內(nèi)存。因此,這種內(nèi)存是”內(nèi)存泄漏“。Val差倫對(duì)”內(nèi)存泄漏“一詞使用了更嚴(yán)格的定義。這是一種可能導(dǎo)致堆耗盡的類(lèi)型,特別是對(duì)于長(zhǎng)期存在的進(jìn)程。
Val差爾泄漏報(bào)告中的“仍然可達(dá)”類(lèi)別指的是只符合“內(nèi)存泄漏”的第一個(gè)定義的分配。這些塊沒(méi)有被釋放,但是它們可以被釋放(如果程序員愿意的話),因?yàn)槌绦蛉匀辉诟欀赶蜻@些內(nèi)存塊的指針。
一般來(lái)說(shuō),沒(méi)有必要擔(dān)心“仍然可以到達(dá)”塊。他們不會(huì)提出這樣的問(wèn)題千真萬(wàn)確內(nèi)存泄漏會(huì)導(dǎo)致。例如,通常沒(méi)有可能從“仍然可達(dá)”的塊中耗盡堆。這是因?yàn)檫@些塊通常是一次分配,對(duì)其的引用在整個(gè)過(guò)程的生存期內(nèi)保持不變。而您可以通過(guò)并確保您的程序釋放全分配內(nèi)存時(shí),這樣做通常沒(méi)有實(shí)際好處,因?yàn)樵谶M(jìn)程終止后,操作系統(tǒng)將回收進(jìn)程的所有內(nèi)存。對(duì)比一下千真萬(wàn)確內(nèi)存泄漏,如果沒(méi)有固定,如果保持足夠長(zhǎng)的運(yùn)行時(shí)間,可能會(huì)導(dǎo)致進(jìn)程耗盡內(nèi)存,或者只會(huì)導(dǎo)致進(jìn)程消耗比所需的內(nèi)存多得多的內(nèi)存。
確保所有分配都具有匹配的“frees”可能唯一有用的情況是,如果您的泄漏檢測(cè)工具無(wú)法判斷哪些塊“仍可訪問(wèn)”(但Val差爾可以做到這一點(diǎn)),或者如果您的操作系統(tǒng)沒(méi)有回收終止進(jìn)程的所有內(nèi)存(所有平臺(tái)都已被移植以完成此操作)。