簡體   English   中英

SGI STL默認分配器是否存在內存泄漏?

[英]Does SGI STL default allocator has memory leak?

__default_alloc_template的兩個靜態成員已用於管理其內存池:

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

分配器從操作系統中查詢堆空間,如下所示:

_S_start_free = (char*)malloc(__n);

然后,它使用此堆的一部分來構建名為_S_free_list的空閑內存列表。

但是我找不到任何可回饋的代碼來將內存還給操作系統,例如:

free(_S_start_free);

我很困惑。

  • 這取決於系統的清潔嗎?
  • 還是其他地方有用於清潔的代碼?

幫我。

第一個問題的答案是否定的!
SGI STL的默認分配器__default_alloc_template在下面的釋放函數中釋放其內存:

 /* __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函數以釋放目標塊,並為其提供目標塊回到操作系統。 否則,對於這些小塊,該函數將把它們放回內存池,而不是將內存還給內存。

其背后的理念是盡可能減少內存碎片,因為頻繁請求和釋放空間將導致大量內存碎片。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM