C語言free函數的原理

    今天在網上看到了這樣一個問題,“如果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 的大小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章