今天在網上看到了這樣乙個問題,「如果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 的大小。
c 語言 malloch函式與free函式
void malloc size t size 動態記憶體分配 從堆 heap 中申請一塊長度略大於size長度的記憶體以作使用,如果不使用free 釋放,申請的記憶體會一直存在,我們稱之為 記憶體洩漏 注意 在申請記憶體時,要根據你想要的記憶體大小進行分配,有點像廢話。看一下 第6行,malloc...
C語言malloc和free實現原理
以下是一段簡單的c malloc和free到底做了什麼?int main malloc和free的debug和release版本實現各不相同,而且相差很大。malloc需要分配的記憶體會比實際的size多36byte。最終分配的記憶體塊如下 crtmemblockheader是乙個雙向鍊錶結構,其定...
C語言malloc和free實現原理
以下是一段簡單的c malloc和free到底做了什麼?int main malloc和free的debug和release版本實現各不相同,而且相差很大。debug版本 malloc需要分配的記憶體會比實際的size多36byte。最終分配的記憶體塊如下 crtmemblockheader是乙個雙...