C語言中的內(nèi)存泄露 怎樣避免與檢測
有些程序并不需要管理它們的動態(tài)內(nèi)存的使用。當(dāng)需要內(nèi)存時,它們簡單地通過分配來獲得,從來不用擔(dān)心如何釋放它。這類程序包括編譯器和其他一些運(yùn)行一段固定的(或有限的)時間然后終止的程序。當(dāng)這種類型的程序終止時,所有內(nèi)存會被自動回收。細(xì)心查驗每塊內(nèi)存是否需要回收純屬浪費(fèi)時間,因為它們不會再被使用。
其他程序的生存時間要長一點(diǎn)。有些工具如日歷管理器、郵件工具以及操作系統(tǒng)本事經(jīng)常需要數(shù)日及至數(shù)周連續(xù)運(yùn)行,并需要管理動態(tài)內(nèi)存的分配和回收。由于C語言通常并不使用垃圾回收器(自動確認(rèn)并回收不再使用的內(nèi)存塊),這些C程序在使用malloc()和free()時不得不非常慎重。
堆經(jīng)常會出現(xiàn)兩種類型的問題:
1.釋放或改寫仍在使用的內(nèi)存(稱為:“內(nèi)存損壞”)。
2.未釋放不再使用的內(nèi)存(稱為:“內(nèi)存泄露”)。
這是最難被調(diào)試發(fā)現(xiàn)的問題之一。如果每次已分配的內(nèi)存塊不再使用而程序并不釋放它們,進(jìn)程就會一邊分配越來越多的內(nèi)存,一邊卻并不釋放不再使用的那部分內(nèi)存。
避免內(nèi)存泄露
每當(dāng)調(diào)用malloc分配內(nèi)存時,注意在以后要調(diào)用相應(yīng)的free來釋放它。
如果不知道如何調(diào)用free與先前的malloc相對應(yīng),那么很可能已經(jīng)造成了內(nèi)存泄露!
一種簡單的方法就是在可能的時候使用alloca()來分配動態(tài)內(nèi)存,以避免上述情況。當(dāng)離開調(diào)用alloca的函數(shù)時,它所分配的內(nèi)存會被自動釋放。
顯然,這并不適用于那些比創(chuàng)建它們的函數(shù)生命期更長的結(jié)構(gòu)。但如果對象的生命期在該函數(shù)結(jié)束前便已經(jīng)終止,這種建立在堆棧上的動態(tài)內(nèi)存分配是一種開銷很小的選擇。有些人不提倡使用alloca,因為它并不是以后總可移植的方法。如果處理器在硬件上不支持堆棧,alloca()就很難高效地實現(xiàn)。
我們使用“內(nèi)存泄露”這個詞是因為一種稀有的資源正在被一個進(jìn)程榨干。內(nèi)存泄露的主要可見癥狀就是罪魁進(jìn)程的速度很減慢。原因是體積大的進(jìn)程更有可能被系統(tǒng)換出,讓別的進(jìn)程運(yùn)行,而且大的進(jìn)程在換進(jìn)換出時花費(fèi)的時間也更多。即使泄露的內(nèi)存本省并不被引用,但它仍用可能存在于頁面中(內(nèi)容自然是垃圾),這樣就增加了進(jìn)程的工作頁數(shù)量,降低了性能。另外需要注意的一點(diǎn)是,內(nèi)存泄露往往比忘記釋放的的數(shù)據(jù)結(jié)構(gòu)要打,因為malloc()所分配的內(nèi)存通常會圓整為下一個大于申請數(shù)量的2的整數(shù)次方(如申請212B,會圓整為256B)。在資源有限的情況下,即使引起內(nèi)存泄露的進(jìn)程并不運(yùn)行,整個系統(tǒng)運(yùn)行速度也會被拖慢。從理論上說,進(jìn)程的大小有一個上限值,這在不同的操作系統(tǒng)中各不相同。在當(dāng)前的SunOS版本中,進(jìn)程的最大地址空間可以多達(dá)4GB。事實上,在進(jìn)程所泄露的內(nèi)存遠(yuǎn)未達(dá)到這個數(shù)量時,磁盤的交換區(qū)早已消耗殆盡。
如何檢測內(nèi)存泄露
觀察內(nèi)存泄露是一個兩步驟的過程。首先,使用swap命令觀察還有多少可用的交換空間:
/usr/sbin/swap -s
total:17228K bytes allocated + 5396K reserved=22626K used,29548K available.
在一兩分鐘內(nèi)鍵入該命令三到四次,看看可用的交換區(qū)是否在減少。還可以使用其他一些/usr/bin/*stat工具如netstat、vmstat等。如發(fā)現(xiàn)波段有內(nèi)存被分配且從不釋放,一個可能的解釋就是有個進(jìn)程出現(xiàn)了內(nèi)存泄露。
欄 目:C語言
下一篇:Linux vmstat命令實戰(zhàn)詳細(xì)解析
本文標(biāo)題:C語言中的內(nèi)存泄露 怎樣避免與檢測
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4176.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10C#中split用法實例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子