deallocate函数是内存释放函数。源码及注释如下:
/* __p may not be 0 */
static void deallocate(void* __p, size_t __n) // __p指向要回收的内存起始地址,__n表示其大小
{
if (__n > (size_t) _MAX_BYTES)// 大于128字节,普通方式开辟和回收内存
malloc_alloc::deallocate(__p, __n);
else {
_Obj* __STL_VOLATILE* __my_free_list
= _S_free_list + _S_freelist_index(__n); // 找到数组中对应的头结点
_Obj* __q = (_Obj*)__p;
// acquire lock
# ifndef _NOTHREADS
/*REFERENCED*/
_Lock __lock_instance;
# endif /* _NOTHREADS */
__q -> _M_free_list_link = *__my_free_list; // 要归还的节点的指针,指向原链表首节点
*__my_free_list = __q; // 数组中的头指针指向要归还的节点,完成向链表前部添加回收节点
// lock is released here
}
}
示意图如下,对小块内存找到其对应的数组中的头指针之后,通过头插法插入链表中: