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