C 語言free 函數的原理

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.