From 25e78c6e27044b96812a15ebc85c9b6064053518 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Tue, 3 Nov 2026 06:28:20 +0000 Subject: fix prev_alloc --- malloclab-handout/mm-implicit.cc | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/malloclab-handout/mm-implicit.cc b/malloclab-handout/mm-implicit.cc index f38032d..0cfc13f 100644 --- a/malloclab-handout/mm-implicit.cc +++ b/malloclab-handout/mm-implicit.cc @@ -67,6 +67,7 @@ void *mm_malloc(size_t size) loggerln("---------- malloc ----------"); loggerln("argument: {}", size); print_list(); + size_t newsize = align(size + SIZE_T_SIZE); loggerln("newsize: {}", newsize); size_t p = (size_t)mem_heap_lo(); @@ -74,7 +75,6 @@ void *mm_malloc(size_t size) while (true) { - //if (newsize == 4080) sleep(1); size_t status = 0; loggerln("offset: {}", (size_t)p-(size_t)mem_heap_lo()); @@ -91,9 +91,10 @@ void *mm_malloc(size_t size) set_size(status, newsize); set_alloc(status, false); - set_prev_alloc(status, true); // TODO + set_prev_alloc(status, prev_alloc); // TODO *(size_t*)p = status; } + status = *(size_t*)p; if (is_alloc(status)) { @@ -101,11 +102,14 @@ void *mm_malloc(size_t size) prev_alloc = true; continue; } - prev_alloc = false; + + // is free + // but too small if (get_size(status) < newsize) { next(p); + prev_alloc = false; continue; } @@ -113,7 +117,7 @@ void *mm_malloc(size_t size) set_size(status, newsize); set_alloc(status, true); - set_prev_alloc(status, true); // TODO + set_prev_alloc(status, prev_alloc); // TODO *(size_t*)p = status; void *ret = (void*)((char*)p + SIZE_T_SIZE); @@ -131,6 +135,14 @@ void *mm_malloc(size_t size) sync_footer(free_header_p); loggerln("split free: free begins {}", offset(free_header_p)); } + // use all of free space + // so need to update next prev_alloc + else + { + size_t p_next = get_size(*(size_t*)p); + if (p_next <= (size_t)mem_heap_hi()) + set_prev_alloc(*(size_t*)p, true); + } loggerln("return: {}" , (size_t)ret-(size_t)mem_heap_lo()); return ret; -- cgit v1.3.1-4-g156e