64,663
社区成员
发帖
与我相关
我的任务
分享
void* mem_pool::allocate(size_t n)
{
obj** my_free_list;
obj* result;
if(n <= 0)
return NULL;
// 如果要分配的内存大于MAX_BLOCK_SIZE, 直接调用malloc分配内存
if(n > MAX_BLOCK_SIZE)
return malloc(n);
try
{
// 获得尺寸n的HASH表地址
my_free_list = free_list + free_list_index(n);
result = *my_free_list;
if(NULL == result)
{
// 如果之前没有分配, 或者已经分配完毕了, 就调用refill函数重新分配
// 需要注意的是, 传入refill的参数是经过对齐处理的
result = (obj *)refill(round_up(n));
}
else
{
// 否则就更新该HASH表的LIST头节点指向下一个LIST的节点, 当分配完毕时, 头结点为NULL
*my_free_list = result->free_list_link;//mark,这块怎么个更新法,不是退出函数作用域的时候,my_free_list不是已经被释放了么,如果再进入这个函数,不是又重新开始么?我没看出来更新HASH表来
}
}catch(...){
result = NULL;
}
return result;
}