我正在嘗試爲練習創建自己的malloc()。我得到了下面的代碼從這個thread.Malloc執行 - 困惑
typedef struct free_block {
size_t size;
struct free_block* next;
} free_block;
static free_block free_block_list_head = { 0, 0 };
// static const size_t overhead = sizeof(size_t);
static const size_t align_to = 16;
void* malloc(size_t size) {
size = (size + sizeof(free_block) + (align_to - 1)) & ~ (align_to - 1);
free_block* block = free_block_list_head.next;
free_block** head = &(free_block_list_head.next);
while (block != 0) {
if (block->size >= size) {
*head = block->next;
return ((char*)block) + sizeof(free_block);
}
head = &(block->next);
block = block->next;
}
block = (free_block*)sbrk(size);
block->size = size;
return ((char*)block) + sizeof(free_block);
}
void free(void* ptr) {
free_block* block = (free_block*)(((char*)ptr) - sizeof(free_block));
block->next = free_block_list_head.next;
free_block_list_head.next = block;
}
我感到困惑治療內存塊的鏈表。在我看來,我們每次需要內存時都會調用sbrk(),並檢查我們以前請求的某些內存是否在此期間未被釋放。
但是我們沒有辦法檢查屬於其他進程的其他內存塊,我們只檢查之前請求的內存並添加到我們的鏈表中。
如果是這樣的話,這是最佳的嗎?這是標準malloc()的工作原理嗎? 有沒有辦法讓我們處理堆上的所有內存?
請解釋我喜歡5,我很難理解這個概念。
「請解釋一下像我5」 - 你不從我的全新鍵盤立即下車你的髒手!? ?? 「 – 2013-04-13 20:12:26
」屬於其他進程的塊「 - 您看不到屬於其他進程的任何內存,只有內核可以(共享內存)。 'malloc'只處理一個進程(可能有多個線程,但只有一個進程)。 – Mat
「但我們無法檢查屬於其他進程的其他內存塊」。呃,好東西,那個。如果你只能訪問其他進程的內存,安全性將會有一個巨大的漏洞。 –