2010-06-21 21 views
6

可能重複:
C programming : How does free know how much to free?free()函數如何收集有關no的信息。字節被釋放

free()被稱爲解除分配由malloc()函數調用分配的內存。 free()從哪裏找到關於no的信息。由malloc()函數分配的字節數。也就是說,你如何符合不。由malloc()分配的字節數以及存儲的信息在哪裏。

-Surya

+1

參見[C編程:免費如何知道多少釋放(http://stackoverflow.com/questions/1518711/c-programming-how-does-free-know-how-much-到自由) – 2010-06-21 07:25:30

回答

3

這是取決於實施。堆以某種方式存儲數據,以方便訪問具有由malloc()返回的指針的數據 - 例如,塊可以在開始處存儲字節數,並且malloc()將返回偏移的指針。

8

C內存分配函數的大多數實現將存儲每個塊的記帳信息,無論是內嵌的還是單獨的。

一種典型的方式(內聯)是實際分配標題和要求的內存,填充到最小尺寸。因此,例如,如果要求20個字節,該系統可以分配一個48字節的塊:含有大小,特殊標記,校驗和,指針下一個/前一個塊等

  • 16字節報頭。
  • 32個字節的數據區(您的20個字節填充爲16的倍數)。

然後提供給你的地址就是數據區的地址。然後,當您釋放該區塊時,free將只取得您提供的地址,並且假設您沒有填充該地址或其周圍的內存,請在緊接之前檢查會計信息。

請記住頭和填充的大小是完全實現定義的(實際上,整個東西是實現定義的a,但inline-accounting-info選項是常見的)。

會計信息中存在的校驗和和特殊標記通常是錯誤的原因,如「覆蓋範圍損壞」,如果覆蓋它們。填充(使分配效率更高)是爲什麼有時您可以在不會造成問題的情況下稍微寫出一點點,而不會造成問題(仍然,不要這樣做,這是未定義的行爲,並且僅僅因爲它有時起作用,這意味着可以做到這一點)。


一個我寫的malloc實現在你有128個字節,無論你問什麼(這是系統中的最大結構的大小)和一個簡單的非內聯嵌入式系統使用位掩碼來決定是否分配了128字節的塊。

其他我開發了16字節塊,64字節塊,256字節塊和1K塊的不同池,再次使用位掩碼來減少會計信息的開銷並提高速度mallocfree(不需要合併相鄰的空閒塊),在我們工作的環境中尤爲重要。

2

當您分配一塊內存時,會分配比您請求的字節更多的字節。有多少依賴於實現,但這裏有一個例子:

struct MallocHeader { 
    struct MallocHeader * prev, * next; 
    size_t length; 
    ... more data, padding, etc ... 
    char data[0]; 
} 

malloc()分配從空閒列表內存,它會分配size + sizeof(struct MallocHeader)並返回data地址。在free()中,將結構MallocHeader中的data的偏移量從您傳入的指針中減去,然後知道大小。

0

這是依賴於實現的 - 它取決於libc的實現以及操作系統的實現(更多關於操作系統的實現)。

我沒有必要知道這樣的事情,但如果你真的想要你可以創建自己的memory allocator

通過的錯誤,我發現,在C++時新的[]運營商商店在向用戶返回該區域後的元素數量分配區開始分配的元素個數(在Visual Studio中)。

new[NUMBER] ---> [NUMBER (4bytes)]+[allocated area] 
it returns the pointer to the allocated area 
and probably when the delete[] operator is called 
it looks 4 bytes before the [allocated area] to see 
how much elements will be deleted 
相關問題