跳至主要內容

内存归还dealloacte

张威大约 1 分钟c/c++SGI STL源码

内存归还dealloacte

归还分配出去的__chunk块,并

  1. 修改_S_free_list对应的元素(保存当前还未分配出去__chunk块的首地址
  2. 修改归还的__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;
  }
}