malloc函式的簡單實現

2021-06-26 22:00:52 字數 1927 閱讀 7358

網上看到的乙個實驗題:

1、先定義乙個全域性緩衝區

#define mempool_size (1024*1024) 

static char g_mempool[mempool_size];

2、實現兩個函式my_malloc/my_free,它們都從g_mempool中分配記憶體,並負責**,合併等

其原理圖如下:

根據原理編寫簡單的**:

#include #include #include #include /* memory control block */

typedef struct chunk chunk;

void mem_init(void);

void *my_malloc(int num_bytes);

void my_free(void *ptr);

static void show_mem_leak(void);

void test_func(void);

void show_heap_info(void);

#define mempool_size (1024*1024)

static char g_mempool[mempool_size]; /* define a global buffer as heap, we use this buffer to test my_malloc/my_free */

static chunk *g_chunk_head; /* the head chunk of this heap memory */

enum ;

int main(int argc, char const *argv)

void mem_init(void)

void *my_malloc(int num_bytes)

/* create a new free mem control block */

free_chunk = (chunk *) ((char *)(ptr + 1) + num_bytes);

strcpy(free_chunk->signature, "o***");

free_chunk->next = null;

free_chunk->state = free;

free_chunk->size = ptr->size - num_bytes - sizeof(chunk);

free_chunk->next = ptr->next;

ptr->state = used;

ptr->size = num_bytes;

ptr->next = free_chunk;

return (void *)(ptr + 1);

}void my_free(void *ptr)

/* merge right chunk*/

if(next_chunk && next_chunk->state == free)

/* merge left chunk */

while(pre_chunk && pre_chunk->next != this_chunk)

if(pre_chunk && pre_chunk->state == free) }

static void show_mem_leak(void)

index++;

ptr = ptr->next; }}

void test_func(void)

void show_heap_info(void)

}

關於malloc其他實現方式:分析的簡單易懂。

Linux下實現malloc函式

include include include malloc.h include includeusing namespace std define block size 32 typedef struct s block t block s block first block null struc...

C語言中malloc函式實現

該實現使用大容量的靜態陣列作為堆,但也可使用作業系統呼叫分配堆。定義了乙個資料型別header儲存每個儲存器塊的簿記資訊,定義了具有header型別元素的堆陣列,這樣就可以很容易地將簿記資訊儲存在儲存器塊中。型別header包含了3塊資訊 指向列表的下乙個塊的指標,當前分配空間的長度,後面的自由空間...

優化之malloc函式實現邏輯

分配 linux核心中專門為程序分配一段記憶體位址,用來存放的內容 程序申請記憶體的增加,程序會通過系統呼叫brk調高堆頂位址 擴充套件記憶體空間,從而linux核心分配給程序更多的記憶體 釋放 程序釋放記憶體時,程序優惠通過系統呼叫brk調低堆頂位址,縮減這段記憶體空間 linux核心便會將其中一...