關於malloc函數後free內存空間的疑問

轉自:http://www.myexception.cn/other/491341.html

關於malloc函數後free內存空間的疑問 
2011年11月22日
   問題: 
  malloc是開出內存空間。 
  現在我寫了這麼一句: 
  char *name; 
  name=(char *)malloc(len*sizeof(char)); 
  name指針是個char指針,指向一個char數據,即只保留了一個char數據的長度信息.free的時候它如何知道開出的空間到底有多長? 
  解答: 
  (1)malloc是一個庫函數,不是由操作系統提供的,絕大部分都是由編譯器提供的庫包自己實現的。malloc如何實現,依賴於不同的操作系統跟不同的c庫。 
  比如,在linux上面,malloc是調用brk系統調用進行內存分配的,而在windows則是HeapAlloc等等類似的系統函數分配內存。 
  一般c庫在初始化的時候都是一下子在堆中分配了一大部分內存,然後再根據自己的算法對這些內存進行分配。至於free怎麼知道要free多少字節。其實很簡單,因爲每用malloc分配一個內存塊,c庫就要記住你分配的多少字節,一般情況下都是記在返回指針的前幾個字節。 
  (2)c庫記憶就是開闢額外的空間記錄分配內存的大小,開闢額外的空間去記錄分配內存的大小也只是一個權宜之計,也只是c庫玩的一種把戲而已。微軟的c庫這麼做,gcc的c庫這麼做,但不代表其他所有編譯器的c庫都這麼做。所以,通俗的講,或者更一般的講,用c庫記憶更具有一般性。 
  (3)比如char * buf1 = (char*)malloc (32);  
  那麼buf1[-8]~ buf1[-1] 都是用來放管理信息的!特別是在windows下編程是如此.  
  buf1的管理結構(8bytes)  |  buf1真正可操作空間(32bytes)   |    下一個空閒堆的管理結構(8bytes)|兩個雙鏈表指針(8bytes) 
  ↑                                     ↑ 
  Free()根據這裏提供的         buf1真正指向這裏 
  管理信息來回收內存 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章