用malloc申請的內(nèi)存,沒有釋放,為什么程序也不會(huì)出錯(cuò)?
最近有好幾位同學(xué)提出了這個(gè)問題。
講到C語言指針的時(shí)候,我們都會(huì)反復(fù)強(qiáng)調(diào),malloc申請的堆內(nèi)存,用完后一定要用free釋放掉,否則光申請不釋放,內(nèi)存就會(huì)變的越來越少,這種現(xiàn)象就叫做內(nèi)存泄漏。
泄漏到一定程度,沒有內(nèi)存可用,程序可能就會(huì)奔潰。
很多同學(xué)在寫代碼的時(shí)候,經(jīng)常忘記釋放內(nèi)存,比如這段代碼:
#includevoid test() { chat*s=(char*)malloc(sizeof(char)*1024 * 1024); } int main() { test(); return 0; }
申請了1M堆內(nèi)存,在程序的任何地方都沒有釋放。
運(yùn)行程序后,一切正常,而且即使運(yùn)行了很多遍,系統(tǒng)也沒有問題。
要解釋這個(gè)問題,就不得不提操作系統(tǒng)的內(nèi)存管理。
不管是在 Linux 還是 Windows 下寫代碼,我們用的內(nèi)存都是虛擬內(nèi)存。
以 32 位 Linux 為例,每個(gè)進(jìn)程啟動(dòng)的時(shí)候,系統(tǒng)都會(huì)給他分配4個(gè)G的虛擬內(nèi)存空間,分為用戶態(tài)和內(nèi)核態(tài),用戶態(tài)又分成了堆、棧、數(shù)據(jù)段、代碼段等等。
由于不同的進(jìn)程使用的虛擬地址空間不同,所以即使程序出現(xiàn)了段錯(cuò)誤,也就是進(jìn)程本身異常退出,并不會(huì)影響其他程序的運(yùn)行。
程序里面用malloc申請的就是堆空間這一段,如果程序一直在運(yùn)行不會(huì)結(jié)束,并且一直在申請沒有釋放,那過一段時(shí)間后程序確實(shí)會(huì)奔潰。
但是我們學(xué)習(xí)的時(shí)候,更多的是一些測試程序,運(yùn)行一下程序就結(jié)束。進(jìn)程一旦結(jié)束,系統(tǒng)就會(huì)回收這段虛擬內(nèi)存空間,對整個(gè)系統(tǒng)或者其他程序也不會(huì)產(chǎn)生什么影響。
平時(shí)寫一些測試程序,還是應(yīng)該養(yǎng)成釋放的習(xí)慣,放在大型項(xiàng)目中,內(nèi)存泄漏既有危害又難排查。
最后,給大家留一個(gè)問題,申請的堆內(nèi)存,需要用free來釋放,那同一塊內(nèi)存用free釋放兩次有沒有問題?
這個(gè)問題在學(xué)習(xí)的時(shí)候也是經(jīng)常遇到,如果你在Linux下做開發(fā),這個(gè)現(xiàn)象就是釋放兩次出現(xiàn)的:
如果往上翻的話,還能看到double free字樣,所以,同樣的一塊堆內(nèi)存,只能釋放一次。
審核編輯:湯梓紅
-
C語言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136860 -
程序
+關(guān)注
關(guān)注
117文章
3787瀏覽量
81057 -
指針
+關(guān)注
關(guān)注
1文章
480瀏覽量
70564 -
代碼
+關(guān)注
關(guān)注
30文章
4788瀏覽量
68625 -
內(nèi)存泄漏
+關(guān)注
關(guān)注
0文章
39瀏覽量
9218
原文標(biāo)題:內(nèi)存泄漏有什么影響
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論