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