把 malloc 放在死循環(huán)里面,會(huì)是什么樣的現(xiàn)象?
比如這樣的代碼,每次使用 malloc 申請(qǐng) 1M 大小的內(nèi)存,其他什么操作也不做。
理論上來(lái)說(shuō),堆內(nèi)存是有限的,如果不停的申請(qǐng),遲早內(nèi)存會(huì)被用完,程序應(yīng)該會(huì)異常退出。
于是我找了個(gè)環(huán)境,把程序運(yùn)行起來(lái)試下。
先用虛擬機(jī),跑的一個(gè) 32 位的紅帽系統(tǒng),程序運(yùn)行起來(lái),好像只是一個(gè)普通的死循環(huán),半天也沒(méi)見(jiàn)他退出,而且程序也不卡頓。
看下進(jìn)程的內(nèi)存使用情況,數(shù)值一直都沒(méi)變。
應(yīng)該可以得出結(jié)論,雖然不停的申請(qǐng),但是因?yàn)閮?nèi)存沒(méi)有使用,所以系統(tǒng)并沒(méi)有真正的分配。
修改下代碼,申請(qǐng)了內(nèi)存后,使用 memset 把內(nèi)存初始化一下,再次運(yùn)行,不一會(huì)虛擬機(jī)卡頓,直到程序被殺死。
換個(gè)環(huán)境,這次使用 64 位的Ubuntu,同樣的代碼,沒(méi)有初始化內(nèi)存,運(yùn)行程序,很快進(jìn)程就被殺死。
運(yùn)行的時(shí)候看了下內(nèi)存的使用情況,確實(shí)是在快速的增長(zhǎng)。
所以在這個(gè)環(huán)境里面,即使申請(qǐng)的堆內(nèi)存沒(méi)有使用,系統(tǒng)也確實(shí)給分配了。
同樣是 malloc 函數(shù),不同的操作系統(tǒng),內(nèi)存管理的策略也不太一樣。
#include#include int main() { char *p = NULL; while (1) { p = (char *)malloc(1); *p = 1; } return 0; }
最后給大家看個(gè)筆試題,也是關(guān)于 malloc 函數(shù),運(yùn)行程序,應(yīng)該是個(gè)怎樣的現(xiàn)象?如果你能看出來(lái),歡迎在評(píng)論區(qū)交流。
-
程序
+關(guān)注
關(guān)注
117文章
3795瀏覽量
81328 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4345瀏覽量
62901 -
malloc
+關(guān)注
關(guān)注
0文章
53瀏覽量
75
原文標(biāo)題:不停的malloc,程序會(huì)不會(huì)異常
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論