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