malloc、free與記憶體片段

來源:互聯網
上載者:User

malloc和free大量使用後回造成記憶體片段,那麼這種片段形成的機理是什嗎?  
  如果機理是申請的記憶體空間大小(太小)所形成的,那麼,申請多大的地區能夠最大限度的避免記憶體片段呢?(這裡的避免不是絕對的避免,只是一種機率)

 

記憶體片段一般是由於閒置連續空間比要申請的空間小,導致這些小記憶體塊不能被利用。  
  產生記憶體片段的方法很簡單,舉個例:  
   
  假設有一塊一共有100個單位的連續空閑記憶體空間,範圍是0~99。如果你從中申請一塊記憶體,如10個單位,那麼申請出來的記憶體塊就為0~9區間。這時候你繼續申請一塊記憶體,比如說5個單位大,第二塊得到的記憶體塊就應該為10~14區間。  
   
  如果你把第一塊記憶體塊釋放,然後再申請一塊大於10個單位的記憶體塊,比如說20個單位。因為剛被釋放的記憶體塊不能滿足新的請求,所以只能從15開始分配出20個單位的記憶體塊。  
   
  現在整個記憶體空間的狀態是0~9空閑,10~14被佔用,15~24被佔用,25~99空閑。其中0~9就是一個記憶體片段了。如果10~14一直被佔用,而以後申請的空間都大於10個單位,那麼0~9就永遠用不上了,造成記憶體浪費。  
   
   
  如果你每次申請記憶體的大小,都比前一次釋放的內村大小要小,那麼就申請就總能成功。  
   
  有的人喜歡自己編寫記憶體管理模組,程式一開始就申請一大塊記憶體,然後以後申請記憶體都在這個大記憶體中取,配合一定的技巧來減少記憶體片段問題。

 

一般按頁為單位,4k  
  不過說起來,malloc   ,operator   new   這些都有自己的分配策略,只要不是使用系統API,而是用庫,則一般來說不用自己考慮

一般來說如果你申請的記憶體都是比較大,而且比較有規律的話(比如你只申請16k和4k兩種大小的記憶體)就沒問題。不過這樣的話就要你自己加一個層次來處理這些大記憶體了。

 

聯繫我們

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