内存归还dealloacte
大约 1 分钟
内存归还dealloacte
归还分配出去的__chunk
块,并
- 修改
_S_free_list
对应的元素(保存当前还未分配出去__chunk
块的首地址) - 修改归还的
__chunk
块的next域

归还__p指向的__n字节chunk块到内存池
// 归还__p指向的__n字节内存空间到内存池
static void deallocate(void* __p, size_t __n){
if (__n > (size_t) _MAX_BYTES)
//因为大于128字节的是由malloc分配,所以释放的底层是free
malloc_alloc::deallocate(__p, __n);
else {
// _S_freelist_index(__n):获取__n字节在_S_free_list中哪个小的内存池分配的
// __my_free_list 指向小内存池的起始地址
_Obj* __STL_VOLATILE* __my_free_list = _S_free_list + _S_freelist_index(__n);
// __q指向要归还的__chunk块
_Obj* __q = (_Obj*)__p;
#ifndef _NOTHREADS
_Lock __lock_instance;//因为要修改静态链表,加锁保证线程安全
#endif
// 即将归还__chunk块的next被赋值成当前还未分配出去__chunk块的首地址
__q -> _M_free_list_link = *__my_free_list;
// 修改_S_free_list的元素,即修改了当前还未分配出去__chunk块的首地址
*__my_free_list = __q;
}
}