void malloc_then_free() { one_malloc(); void *p = get_heap_base(); // should be allocated chunk Free_Header *freelist0 = get_freelist(); free(p); Free_Header *freelist1 = get_freelist(); // allocated chunk is freed and becomes head of new freelist assert_addr_equal(freelist1, p); assert_addr_equal(freelist1, get_heap_base()); assert_addr_not_equal(freelist0, freelist1); assert_equal(chunksize(freelist1) + chunksize(freelist1->next), HEAP_SIZE); Heap_Info info = verify_heap(); assert_equal(info.busy, 0); assert_equal(info.busy_size, 0); assert_equal(info.free, 1); // 1 free chunk after merging assert_equal(info.free_size, HEAP_SIZE); }
void two_malloc() { one_malloc(); void *p0 = get_heap_base(); Free_Header *freelist0 = get_heap_freelist(); Busy_Header *p = malloc(200); assert_addr_not_equal(p, NULL); // check 2nd alloc chunk assert_equal(p, freelist0); // should return previous free chunk assert_equal(chunksize(p), request2size(200)); // check remaining free chunk Free_Header *freelist1 = get_heap_freelist(); assert_addr_not_equal(freelist0, freelist1); assert_addr_not_equal(freelist0, get_heap_base()); assert_equal(chunksize(freelist1), HEAP_SIZE-request2size(100)-request2size(200)); assert_equal(chunksize(p0)+chunksize(p)+chunksize(freelist1), HEAP_SIZE); assert_addr_equal(freelist1->next, NULL); Heap_Info info = verify_heap(); assert_equal(info.busy, 2); assert_equal(info.busy_size, request2size(100) + request2size(200)); assert_equal(info.free, 1); assert_equal(info.free_size, HEAP_SIZE - request2size(100) - request2size(200)); }