2010-02-25 18 views
8

這個問題在接受採訪時被問到了我。當試圖釋放由堆管理器分配的內存時,會發生什麼情況?

假設char * p = malloc(n)賦值多於n,例如分配N個字節的內存並釋放分配給p的內存空間(p)。

堆管理器可以執行這種錯誤的分配嗎? 現在會發生什麼情況,將釋放n個字節還是釋放N個字節?

有沒有什麼方法可以找到釋放了多少內存?

編輯

有沒有找到多少內存被釋放的方法?

聊勝於無,

mallinfo()可以提供一些線索通過「弗雷德·拉森」爲指出

+6

你爲什麼認爲這樣的分配有問題?無論分配多少「實際」字節「malloc()」,只能使用「n」個字節,而「free()」將釋放所有分配的字節。大多數'malloc'實現分配更多的空間,然後出於效率原因請求。一個實現定義了「malloc」和「free」,根據定義,它們必須就分配方案達成一致。 – 2010-02-25 17:59:47

回答

8

是的,幾乎每次你都會發生這種情況malloc()malloc塊標題包含有關塊大小的信息,當調用free()時,它將該量返回給堆。這不是錯誤的,它是預期的操作。

一個簡單的實現可能會在返回的指針之前的空間中存儲塊的大小。然後,free()會是這個樣子:

void free(void *ptr) 
{ 
    size_t *size = (size_t *)ptr - 1; 

    return_to_heap(ptr, *size); 
} 

return_to_heap()用在這裏的意思是,做指定的存儲塊返回堆供將來使用的實際工作的功能。

+0

有沒有一種方法來找出有多少內存被釋放? – Rozuur 2010-02-25 18:07:56

+0

@rozuur:所有由'malloc()'分配的內存都將被'free()'釋放。我認爲你真正的問題是如何找出分配了多少內存。 (和答案?至少與要求一樣多,如果分配成功。) – Bill 2010-02-25 18:33:46

+1

rozuur:看看這個網頁:http://msdn.microsoft.com/en-us/library/ms220938(VS.80) .aspx 它提供了一個想法,當你要求一大塊內存時,實際做了什麼。大多數實現與此非常相似。 – ThePosey 2010-02-25 18:40:58

4

是,堆管理器被允許返回超過ň字節的塊。使用free釋放返回的指針是完全安全的(並且是必需的!),並且free將釋放所有的指針。

許多堆實現通過將元數據塊插入堆來跟蹤其分配。 free將查找該元數據以確定要釋放多少內存。不過,這是特定於實現的,因此無法知道有多少malloc給了你,一般來說,你不應該在意。

1

通常堆管理器將釋放所分配的任何內容。它在某處存儲此信息,並在調用free()時查找它。

如果堆管理器分配的內存比請求的多,則它不是「錯誤」的。堆管理器通常使用固定的塊大小,並在滿足請求時將四捨五入到下一個適當的塊大小。堆管理者的工作要儘可能高效,而且往往效率很高,只會造成一些小的低效率。

+0

「效率往往很高,因爲效率很低」很好的報價8 ^) – caseman 2010-02-25 19:10:53

1

這是malloc的默認行爲。它會返回NULL或指向內存部分的指針,至少與您要求的一樣長。所以,自由必須能夠處理比所要求的更長的時間。

找出多少內存實際上是空閒或分配是一個特定於平臺的問題。

1

其他答案已經很好地解釋了塊大小是如何處理的。要了解釋放多少內存,我能想到的唯一解決方案是在免費之前和之後撥打mallinfo()

相關問題