1. 程式人生 > >[C/C++] free()函式和iOS release--(重點free函式)整理彙總

[C/C++] free()函式和iOS release--(重點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 的大小。