2011-10-09 24 views
1

可能重複:
How do malloc() and free() work?malloc和free是如何在C中實現的?

我讀的地方,呼籲免費使用相同的指針參數兩次會導致不確定的行爲。那麼免費怎麼知道它有多少內存要釋放?當我們調用malloc/calloc/realloc時,堆總是分配連續的內存嗎?請提供相關文章/帖子/博客等的鏈接。

+1

你並不需要知道自由工作是如何理解的。只要你記得在指針上釋放後,你不再擁有該位置的內存。嘗試訪問它,你會受到懲罰。 – 2011-10-09 20:48:53

+0

@WTP:我只是好奇它如何在引擎蓋下工作。 – Bruce

+2

也許你應該改變你的問題,說你想知道如何實現malloc/free。聲明「爲了理解這一點,我必須先了解自由作品」是否有誤導性。 –

回答

5

如何mallocfree工作是實現定義的。通常有關內存塊的信息將存儲在低於ptr的標題中。但不一定。

關於mallocfree的好處是您不需要知道它們是如何工作的。系統爲您處理細節。

我讀了一個地方,使用相同的指針參數調用兩次空閒導致未定義的行爲。爲了理解這一點,我必須首先知道自由的工作方式?

我不確定我是否同意這一說法。你只需要遵循規則。

當我們調用malloc/calloc/realloc時,堆總是分配連續的內存嗎?

如果您的意思是返回的內存塊在地址空間中是連續的,那麼是的。如果你的意思是連續的分配是連續的,那麼沒有。

+0

謝謝你的回答。你能告訴我在哪裏可以找到gcc(或者其他一些衆所周知的編譯器)如何實現免費的嗎?至少爲一個編譯器學習這將是一件好事。 – Bruce

+0

編譯器不實現免費。 libc的確如此。 – arsenm

+1

@Bruce你可以在這裏閱讀關於一個內存分配器的內容:http://g.oswego.edu/dl/html/malloc.html –

0

如果您想查看實現,請查找glibc,它是包含內存管理功能的C標準庫的GNU實現。但請注意,實現的確切細節在其他平臺上會有所不同,並可能在標準庫的各個版本之間發生變化。

1

您可以閱讀關於tcmalloc頁面上的示例實現。這是相對短而直接:http://goog-perftools.sourceforge.net/doc/tcmalloc.html(跳轉到概述)

如果你想知道malloc如何從操作系統請求內存,它通常是通過調用sbrkmmap。但是這當然是實現定義的。