C語言free函數的原理——————————【Badboy】

來源:互聯網
上載者:User

標籤:tracking   計算   系統管   部分   語言   方法   記憶體管理   表示   記憶體   

    今天在網上看到了這樣一個問題,“假設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語言free函數的原理——————————【Badboy】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.