SGI STL默认分配器是否有内存泄漏?

时间:2017-09-14 04:43:52

标签: c++ memory-management stl

已经采用了__default_alloc_template的两个静态成员来管理它的内存池:

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, triggerTime, mInterval, pendingIntent);

来自操作系统的分配器查询堆空间如下:

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

然后它使用此堆的一部分构建名为_S_free_list的空闲内存列表。

但我无法找到任何可以将内存重新用于操作系统的代码:

_S_start_free = (char*)malloc(__n);

我很困惑。

  • 这取决于系统的清洁?
  • 或其他地方有清洁代码?

帮助我。

1 个答案:

答案 0 :(得分:0)

第一个问题的答案是否定的! 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函数来释放目标块,将它们返回给操作系统。否则,对于那些小块,不是给内存返回,而是将函数放回内存池。

这背后的哲学是尽可能减少内存碎片,因为频繁请求和释放空间会导致大量内存碎片。