2013-02-20 50 views
0

我分配的內存:內存配置查詢

int *p = (int *) malloc(sizeof(int)); 

然後我typcase它:

char *new = (char *)p; 

我釋放它:

free(new); 

1)有多少內存將被釋放的性格有1個字節的空間? 2)內存管理器應該怎樣的內部機制(在嵌入式系統中)跟蹤分配的內存和釋放內存? (沒有布爾允許)

+0

'的malloc()'和'免費()'處理'無效*,並沒有關於類型的想法 - 他們只是對付你問大小的內存塊。 – 2013-02-20 10:44:04

回答

1

當您致電malloc(或其中一個兄弟姐妹)時,內存大小將分配它存儲爲「關於此分配的信息」(info_block)的一部分。 malloc不知道你是否在sizeof(int)過去了,不斷4sizeof(short)*2或任何其他你可能已經給了它[其實,很可能擴大分配,比方說,16個字節 - 這大小存儲作爲配置的一部分。

當您稍後致電free時,它將「找回」info_block,然後它知道要釋放的大小。因此,只要指針內部的值是相同的值,那麼對指針執行的操作或其他操作無關緊要。

+0

我想避免的樣子起伏,就像我寫一個新的內存管理,也沒有不想要查找/布爾/尺寸存儲 – user2071394 2013-02-20 11:45:14

+0

「查找」,在我看過的所有分配器,是爲「減去的sizeof一樣簡單(信息)從我們得到的指針「,所以它不是一個漫長的操作。然後一些分配器嘗試將前一個/下一個可用內存塊與當前的內存塊合併,但並非總是如此。如果碎片化是一個問題,那麼使用一組固定大小的「桶」是避免這種情況的好方法。 – 2013-02-20 12:08:25

0

我您的具體情況,答案取決於基礎構建築。假設一個32位的機器,指針的大小總是4個字節。如果你使用它可以得到麻煩,即

int *p = (int *) malloc(sizeof(char)); 

但你會得到一個警告,我相信。

所以你的情況這是成爲分配的4個字節。

另外,你不應該投malloc的虛空*:

int *p = malloc(sizeof(int)); 

是完全沒有問題。