while(true) { if (*handle == 0)//当前位置内存未分配给用户,检查大小 { UINT ToFind = (_Size / AlignSize) - 1; //需要搜索的次数 for (UINT register i = 1; i <= ToFind; i++)//注handle[0]已经等于0 { switch(IsBadPtr(&handle[i])) { case PTR_HIGH: //当前内存不足分配,继续提交内存 { if(extend(_Size - (i * AlignSize))) { break; } } case PTR_LOW: { return NULL; } } if (handle[i] != 0)//空间不足,继续搜索可分配内存 { handle = &handle[i]; goto FIND_NEXT; } } if(*LPLONG(handle) == 0) { memset(user, 0, handle->align - ObjSize); } if(FindPtr == NULL) { //handle为内存池基址, 当前是第一节点, 且必定存在下一节点, 搜索 //之并建立链表关系 PBLOCK_INFO(handle)->next = findnext((PULONG)(LPBYTE(handle) + *handle)); assert(PBLOCK_INFO(handle)->next != NULL); assert(PBLOCK_INFO(PBLOCK_INFO(handle)->next)->prior == NULL);//该节点前趋必须NULL PBLOCK_INFO(handle)->next->prior = (PBLOCK_INFO)handle; goto RET; } //当前不是第一节点, 修改链表关系 PBLOCK_INFO(handle)->prior = FindPtr; PBLOCK_INFO(handle)->next = FindPtr->next; assert(PBLOCK_INFO(handle)->next != PBLOCK_INFO(handle)->prior);//前趋=后继不合法 if (FindPtr->next != NULL) { FindPtr->next->prior = (PBLOCK_INFO)handle; } FindPtr->next = (PBLOCK_INFO)handle; RET: return (PBLOCK_INFO)handle; } else { FIND_NEXT: FindPtr = (PBLOCK_INFO)handle; handle = (PULONG)(LPBYTE(handle) + *handle);//根据块大小信息移动到下一指针 CHECK_NEXT: switch(IsBadPtr(handle)) { case PTR_HIGH: //当前内存不足分配,继续提交内存 { if(extend(_Size)) { goto CHECK_NEXT; } } case PTR_LOW: { return NULL; } } } }
该算法已经被否决, 新算法参见RLIB源码.