2017-09-14 66 views
0

兩個__default_alloc_template的靜態成員已經採取了管理它的內存池:SGI STL默認分配器有內存泄漏嗎?

static char* _S_start_free; 
static _Obj* __STL_VOLATILE _S_free_list[_NFREELISTS]; 

從工作制像分配器查詢堆空間如下:

_S_start_free = (char*)malloc(__n); 

然後用這個堆建築的一部分一個名爲_S_free_list的空閒內存列表。

但我無法找到任何代碼resbonsible給了內存回像操作體系:

free(_S_start_free); 

我很困惑。

  • 它取決於系統的清潔?
  • 或其他地方有清潔代碼?

幫幫我。

+0

它可能不需要清理自己,如果它將在程序的生命中生活 – vu1p3n0x

+1

在現代操作系統上,程序在虛擬內存中運行。當程序結束時,內存映射就會消失。 –

回答

0

第一個問題的答案是NO!
默認分配器SGI STL的__default_alloc_template釋放其存儲器在它的DEALLOCATE功能波紋管:

/* __p may not be 0 */ 
static void deallocate(void* __p, size_t __n) { 
    if (__n > (size_t) _MAX_BYTES) 
     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 
    } 
} 

當需要時被釋放存儲器塊是啤酒然後_MAX_BYTES(128個字節「的大塊」) ,函數將調用malloc_alloc :: deallocate(__ p,__n),它只是簡單地調用c malloc函數來釋放目標塊,並將它們返回給操作系統。否則,該函數不會將內存退回給那些小塊,而是將它們放回內存池。

這背後的哲學是儘可能減少內存碎片,因爲經常請求和釋放空間會導致大量內存碎片。

+0

能否詳細說明一下?這看起來像是爲了分配與它分配的對象,而不是爲了清理其內部結構。 – vu1p3n0x

+0

像Vector這樣的容器負責釋放由_S_free_list鏈接的內存。至於內存池,當程序退出時它會被取回。通常,在單線程進程的環境中,內存池被限制在一個小空間內。這就是記憶池的意義,是最後一個站立的人。 – RyanBao

+0

感謝您的回答。請耐心等待我上面的模糊描述。但是我擔心的是,內存池的末端在哪裏。 – appleeated