2012-05-11 42 views
1

我想知道是否有人可以指向我的資源,給了堆的深入解釋。我想知道更多關於實踐中使用的頭文件以及free()函數如何通過刪除頭信息實際「釋放」內存。許多資源只是給通用堆頭和免費()在C

struct heapHeader 
    { 
     heapHeader* next; 
     heapHeader* previous; 
     unsigned int size; 
    } 

,然後繼續說,這是從來沒有在實踐中實現。因此,總結一下,我想知道更多關於heap頭文件是如何在「練習」中實現的以及函數如free()如何與所述頭文件進行交互。

+3

這將是特定實現。 C標準並沒有告訴一個如何實現一個堆,它只是陳述了一個C程序的語義。任何遵守這些語義的實現都是有效的。我建議下載C(GNU C作品)的開源實現。 –

+0

查找['dlmalloc'](http://g.oswego.edu/dl/html/malloc.html)(Doug Lea Malloc)的代碼一個非常嚴重的生產質量實施。在K&R2中查看另一個實現。副手,我不知道GNU C Library是使用'dlmalloc'還是它自己的,但是如果它使用它自己的話,看看那個。 Perl包含它自己的'malloc';你可以選擇是否使用它;那將是第四個資源。 –

+0

GNU C庫中的malloc實現的確基於Doug Lea的分配器。但當然它已經長出了自己的頭髮,就像線索在競爭和不相干的情況下分開競技場。 – Kaz

回答

2

C語言標準沒有定義堆的細節。它指定了malloc,calloc,realloc和free,以及它們執行的任務,參數以及程序員可以對結果執行的操作。

如果您要求提供實施細節,那麼您很有可能會做出假設,以後可能會對您產生影響。除非你有非常具體的理由這樣做,否則你不需要調查內部運作。 malloc和free工作的方式可能會隨着下一個OS版本,下一個編譯器版本,甚至是使用的編譯選項而改變。