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