亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語(yǔ)言

C語(yǔ)言中的內(nèi)存怎樣避免與檢測(cè)與泄露

時(shí)間:2024-06-17 01:39:14 C語(yǔ)言 我要投稿
  • 相關(guān)推薦

C語(yǔ)言中的內(nèi)存怎樣避免與檢測(cè)與泄露

  有些程序并不需要管理它們的動(dòng)態(tài)內(nèi)存的使用。當(dāng)需要內(nèi)存時(shí),它們簡(jiǎn)單地通過(guò)分配來(lái)獲得,從來(lái)不用擔(dān)心如何釋放它。這類程序包括編譯器和其他一些運(yùn)行一段固定的(或有限的)時(shí)間然后終止的程序。當(dāng)這種類型的程序終止時(shí),所有內(nèi)存會(huì)被自動(dòng)回收。細(xì)心查驗(yàn)每塊內(nèi)存是否需要回收純屬浪費(fèi)時(shí)間,因?yàn)樗鼈儾粫?huì)再被使用。

  其他程序的生存時(shí)間要長(zhǎng)一點(diǎn)。有些工具如日歷管理器、郵件工具以及操作系統(tǒng)本事經(jīng)常需要數(shù)日及至數(shù)周連續(xù)運(yùn)行,并需要管理動(dòng)態(tài)內(nèi)存的分配和回收。由于C語(yǔ)言通常并不使用垃圾回收器(自動(dòng)確認(rèn)并回收不再使用的內(nèi)存塊),這些C程序在使用malloc()和free()時(shí)不得不非常慎重。

  堆經(jīng)常會(huì)出現(xiàn)兩種類型的問(wèn)題:

  1.釋放或改寫仍在使用的內(nèi)存(稱為:“內(nèi)存損壞”)。

  2.未釋放不再使用的內(nèi)存(稱為:“內(nèi)存泄露”)。

  這是最難被調(diào)試發(fā)現(xiàn)的問(wèn)題之一。如果每次已分配的內(nèi)存塊不再使用而程序并不釋放它們,進(jìn)程就會(huì)一邊分配越來(lái)越多的內(nèi)存,一邊卻并不釋放不再使用的那部分內(nèi)存。

  避免內(nèi)存泄露

  每當(dāng)調(diào)用malloc分配內(nèi)存時(shí),注意在以后要調(diào)用相應(yīng)的free來(lái)釋放它。

  如果不知道如何調(diào)用free與先前的malloc相對(duì)應(yīng),那么很可能已經(jīng)造成了內(nèi)存泄露!

  一種簡(jiǎn)單的方法就是在可能的時(shí)候使用alloca()來(lái)分配動(dòng)態(tài)內(nèi)存,以避免上述情況。當(dāng)離開(kāi)調(diào)用alloca的函數(shù)時(shí),它所分配的內(nèi)存會(huì)被自動(dòng)釋放。

  顯然,這并不適用于那些比創(chuàng)建它們的函數(shù)生命期更長(zhǎng)的結(jié)構(gòu)。但如果對(duì)象的生命期在該函數(shù)結(jié)束前便已經(jīng)終止,這種建立在堆棧上的動(dòng)態(tài)內(nèi)存分配是一種開(kāi)銷很小的選擇。有些人不提倡使用alloca,因?yàn)樗⒉皇且院罂偪梢浦驳姆椒。如果處理器在硬件上不支持堆棧,alloca()就很難高效地實(shí)現(xiàn)。

  我們使用“內(nèi)存泄露”這個(gè)詞是因?yàn)橐环N稀有的資源正在被一個(gè)進(jìn)程榨干。內(nèi)存泄露的主要可見(jiàn)癥狀就是罪魁進(jìn)程的速度很減慢。原因是體積大的進(jìn)程更有可能被系統(tǒng)換出,讓別的進(jìn)程運(yùn)行,而且大的進(jìn)程在換進(jìn)換出時(shí)花費(fèi)的時(shí)間也更多。即使泄露的內(nèi)存本省并不被引用,但它仍用可能存在于頁(yè)面中(內(nèi)容自然是垃圾),這樣就增加了進(jìn)程的工作頁(yè)數(shù)量,降低了性能。另外需要注意的一點(diǎn)是,內(nèi)存泄露往往比忘記釋放的的數(shù)據(jù)結(jié)構(gòu)要打,因?yàn)閙alloc()所分配的內(nèi)存通常會(huì)圓整為下一個(gè)大于申請(qǐng)數(shù)量的2的整數(shù)次方(如申請(qǐng)212B,會(huì)圓整為256B)。在資源有限的情況下,即使引起內(nèi)存泄露的進(jìn)程并不運(yùn)行,整個(gè)系統(tǒng)運(yùn)行速度也會(huì)被拖慢。從理論上說(shuō),進(jìn)程的大小有一個(gè)上限值,這在不同的操作系統(tǒng)中各不相同。在當(dāng)前的SunOS版本中,進(jìn)程的最大地址空間可以多達(dá)4GB。事實(shí)上,在進(jìn)程所泄露的內(nèi)存遠(yuǎn)未達(dá)到這個(gè)數(shù)量時(shí),磁盤的交換區(qū)早已消耗殆盡。

  如何檢測(cè)內(nèi)存泄露

  觀察內(nèi)存泄露是一個(gè)兩步驟的過(guò)程。首先,使用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)存被分配且從不釋放,一個(gè)可能的解釋就是有個(gè)進(jìn)程出現(xiàn)了內(nèi)存泄露。

【C語(yǔ)言中的內(nèi)存怎樣避免與檢測(cè)與泄露】相關(guān)文章:

C語(yǔ)言中內(nèi)存分配問(wèn)題04-02

C語(yǔ)言中的指針和內(nèi)存泄漏03-19

單片機(jī)C語(yǔ)言有幾種內(nèi)存泄露問(wèn)題03-19

C/C++內(nèi)存管理12-04

C語(yǔ)言中volatile的含義12-03

C 語(yǔ)言中宏的使用12-03

C語(yǔ)言中的鏈接編寫05-26

C語(yǔ)言中的指針是什么03-17

C語(yǔ)言中strpbr()函數(shù)的用法03-19