網上看到的乙個實驗題:
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核心便會將其中一...