繁体   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