如果malloc 了一塊字符串的內(nèi)存,然后,它改變了這個(gè)字符串的大小,問(wèn)會(huì)不會(huì)有一部分內(nèi)存沒(méi)有被釋放掉。當(dāng)然,肯定會(huì)釋放掉的,但是一直沒(méi)有了解過(guò)free 的原理,不敢亂說(shuō)。我看了一下操作系統(tǒng)的內(nèi)存管理,基本上是這樣的,當(dāng)然各個(gè)系統(tǒng)的實(shí)現(xiàn)不一樣。
操作系統(tǒng)管理內(nèi)存,維護(hù)了一個(gè)空閑內(nèi)存鏈表,malloc從個(gè)鏈表中選出一個(gè)來(lái)使用,每個(gè)內(nèi)存塊都有一個(gè)頭部來(lái)表示這個(gè)內(nèi)存的基本信息,如內(nèi)存大小,所以free 時(shí)候 能夠記住原來(lái)指針?biāo)傅膬?nèi)存大小,而不是用內(nèi)存塊中是否有 /0 來(lái)臨時(shí)計(jì)算指向內(nèi)存的大小,不要字符串的計(jì)算長(zhǎng)度的方法所誤導(dǎo)。
還有一點(diǎn)要注意的就是,系統(tǒng)在free 內(nèi)存的時(shí)候,記住的只是malloc 時(shí)候的地址,和分配內(nèi)存的大小。
比如 char *p = (char *)malloc(10); 就會(huì)產(chǎn)生分配10個(gè)字節(jié)。如果 你把指針的地址改變了 p = p + 1; 然后 free 就要出問(wèn)題了。程序會(huì)崩潰。
如果一定要改變指針的值,建議這樣做 char *newp = p; 然后 改變 newp = newp + 1 , 最后 free(p);
還有一點(diǎn)要注意,一個(gè)長(zhǎng)度 為10 的字符串要占用 11個(gè)字節(jié)。因?yàn)檫€有一個(gè) '/0', 所以分配內(nèi)存的時(shí)候要分配 lenght + 1 的大小。
新聞熱點(diǎn)
疑難解答
圖片精選