什么是內(nèi)存泄露
內(nèi)存泄露是一種實現(xiàn)錯誤。它將會慢慢耗盡系統(tǒng)內(nèi)存空間。當(dāng)計算機(jī)運(yùn)行進(jìn)程的時候,可能需要或多或少的內(nèi)存。這主要以來于進(jìn)程每時每刻將要執(zhí)行的命令。當(dāng)進(jìn)程需要更多的內(nèi)存時,將給操作系統(tǒng)提出請求。當(dāng)進(jìn)程不再需要內(nèi)存的時候,將會把內(nèi)存釋放掉,還給操作系統(tǒng)。這樣其他進(jìn)程才可以使用。如果進(jìn)程沒有正確的將內(nèi)存還給操作系統(tǒng),盡管它不再使用,但是內(nèi)存的狀態(tài)仍然是不可再分配。這將減少可用內(nèi)存。
一般我們常說的內(nèi)存泄露是指堆內(nèi)存的泄露。堆內(nèi)存是指程序從堆中分配的,大小任意的(內(nèi)存塊的大小可以在程序運(yùn)行期決定),使用完后必須釋放的內(nèi)存。應(yīng)用程序一般使用malloc,realloc,new等函數(shù)從堆中分配到一塊內(nèi)存,使用完后,程序必須負(fù)責(zé)相應(yīng)得調(diào)用free或delete釋放該內(nèi)存塊,否則,這塊內(nèi)存就不能再次被使用,我們就說這塊內(nèi)存泄露了。
對于一些界面的資源,如window的創(chuàng)建,menu的創(chuàng)建,dc的創(chuàng)建等等,對于這些,我們需要在不使用它們的時候,調(diào)用相應(yīng)的函數(shù),進(jìn)行釋放。否則也將會造成內(nèi)存泄露。
內(nèi)存泄露的后果
內(nèi)存泄露會因為減少可用內(nèi)存的數(shù)量從而降低計算機(jī)的性能。最終,在最糟糕的情況下,過多的可用內(nèi)存被分配掉導(dǎo)致全部或部分設(shè)備停止正常工作,或者應(yīng)用程序崩潰。
內(nèi)存泄露可能不嚴(yán)重,甚至能夠被常規(guī)的手段檢測出來。在現(xiàn)代操作系統(tǒng)中,一個應(yīng)用程序使用的常規(guī)內(nèi)存在程序終止時被釋放。這表示一個短暫的應(yīng)用程序中的內(nèi)存泄露不會導(dǎo)致嚴(yán)重后果。
在以下情況下,內(nèi)存泄露導(dǎo)致較嚴(yán)重的后果:
一是程序運(yùn)行后置之不理,并且隨著時間的流失消耗越來越多的內(nèi)存(比如服務(wù)器上的后臺任務(wù),尤其是嵌入式系統(tǒng)中的后臺任務(wù),這些任務(wù)可能被運(yùn)行后很多年內(nèi)都置之不理);
二是新的內(nèi)存被頻繁的分配,比如當(dāng)現(xiàn)實電腦游戲或動畫視頻畫面時;
三是程序能夠請求未被釋放的內(nèi)存(比如共享內(nèi)存),甚至是程序終止的時候;
四是泄露在操作系統(tǒng)內(nèi)部發(fā)生;
五是泄露在系統(tǒng)關(guān)鍵驅(qū)動中發(fā)生;
六是內(nèi)存非常有限,比如在嵌入式系統(tǒng)或便攜設(shè)備中
七是當(dāng)運(yùn)行于一個終止時內(nèi)存并不自動釋放的操作系統(tǒng)治上,而且一旦丟失,只能通過重啟來恢復(fù)。
在這里,我著重強(qiáng)調(diào)一下嵌入式系統(tǒng),由于系統(tǒng)內(nèi)存非常有限,編寫應(yīng)用程序的時候,一定要防止內(nèi)存泄露的發(fā)生。如果發(fā)生,可能是會使你編寫的應(yīng)用程序出現(xiàn)異常。或者你的系統(tǒng)的性能將會大大降低。甚至有時你不得不依靠重起系統(tǒng)來恢復(fù)。
內(nèi)存泄露的檢測
檢測內(nèi)存泄露的工具:debugnew
http://dev.csdn.net/article/58/58407.shtm
淺談內(nèi)存泄漏(二)
http://www.vczx.com/article/show.php?id=68
一個跨平臺的 C++ 內(nèi)存泄漏檢測器
http://www-128.ibm.com/developerworks/cn/linux/l-mleak2/index.html
內(nèi)存泄露檢測
http://www.shnenglu.com/Ipedo/archive/2005/10/27/867.aspx
posted on 2008-11-02 10:50
Sandy 閱讀(376)
評論(0) 編輯 收藏 引用 所屬分類:
windows學(xué)習(xí)